我尝试使用python中的cx_Oracle连接到两个数据库(两个不同的主机)。当我创建db2
的示例时,客户端似乎仍然设置为第一个连接db1
。尝试关闭连接并删除进程中的变量没有帮助。
#Retrieve Data from Databases
db1 = OracleDatabaseConnector(".env_db1")
df_db1 = db1.execute_query(qry)
db1.con.close()
del db1
db2 = OracleDatabaseConnector(".env_db2") #db2 is not correctly initialized - instance has still information of db1
df_db2 = db2.execute_query(qry2) #Error is: Ora-00942 Table or View does not exist - as still connected to db1
db2.con.close()
del db2
字符串
OracleDatabaseConnector的db.con
基于cx_Oracle.connect()
我发现了这个Github注解,但是提供的代码在我的设置Oracle 19c on-prem
上不起作用。
任何帮助非常感谢!
编辑OracleDatabaseConnector
附加信息
class OracleDatabaseConnector:
def __init__(self, env_file_path: str):
self.env = env_file_path
load_dotenv(self.env)
self.con = self.__get_connection()
def __get_connection(self):
dsn = oracledb.ConnectParams(host=os.environ.get("HOSTNAME")
, port=os.environ.get("PORT")
, service_name=os.environ.get("SERVICE_NAME")
).get_connect_string()
return oracledb.connect(user=os.environ.get("USER")
, password=os.environ.get("PASS")
, dsn=dsn)
def execute_query(self, sql_qry: str):
try:
return pd.read_sql_query(sql_qry, self.con)
except:
print("Error executing SQL Query!")
raise Exception
型
EDIT 2增加了两个连接的DSN信息(升级到python-oracledb库后)。
db1.con.dsn
Out[5]: '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname_db1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=db1_SERVICE_NAME_APP)))'
db2.con.dsn
Out[6]: '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname_db1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=db1_SERVICE_NAME_APP)))'
型
两个连接的DSN字符串相同。我检查了两个.env
文件。它们包括相应的正确凭据和客户端信息。
1条答案
按热度按时间t5fffqht1#
问题不在于oracle客户端,而是在这个特定的情况下,使用python dotenv库通过
load_dotenv
设置的环境变量。load_dotenv
具有参数override
,默认设置为False
。当像load_dotenv('.env', override=True)
一样使用时,从同一脚本调用第二个.env文件将相应地更新os变量。在this github issue上找到解决方案。