Python CX_Oracle -可以多个连接到不同的数据库?

6yjfywim  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(151)

我尝试使用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文件。它们包括相应的正确凭据和客户端信息。

t5fffqht

t5fffqht1#

问题不在于oracle客户端,而是在这个特定的情况下,使用python dotenv库通过load_dotenv设置的环境变量。
load_dotenv具有参数override,默认设置为False。当像load_dotenv('.env', override=True)一样使用时,从同一脚本调用第二个.env文件将相应地更新os变量。
this github issue上找到解决方案。

相关问题