Python 3.6:连接到Oracle 11 Database(cx_Oracle模块)时更改服务的问题

时间:2019-04-05 10:20:24

标签: python-3.x cx-oracle

我在通过cx_Oracle模块更改数据库服务时遇到一些问题。

即使删除对象或在子进程中创建新的连接,第一个连接似乎仍会“持久”。因此,当我尝试与另一个服务建立连接时,会引发“ ORA-01017:无效的用户名/密码;登录被拒绝”

我用钱包安排联系。

  class Connection(object):
    def __init__(self,oracle_user,instance=os.environ["ORACLESRV"],env=os.environ["ENVPURPOSE"]):
        self.oracle_user = oracle_user
        self.instance = instance
        self.env = env

        wallet_path = "$SCRIPTS/oracle/wallets/{env}/{oracle_user}".format(env=self.env.upper(),oracle_user=self.oracle_user.upper())
        os.environ["TNS_ADMIN"] = os.path.expandvars(wallet_path)
        os.environ["NLS_LANG"] = "Italian_Italy.UTF8"
        self.connection = cx_Oracle.connect("/@"+self.instance.upper())

第一个连接没有错误,但是当我尝试更改服务时(即Connection类的“实例”参数),该连接被拒绝。参数已正确传递给构造函数,但就像脚本不断看到第一个钱包一样,该钱包显然包含其他服务的user / pwd。

如何克服这种“持久性”?

1 个答案:

答案 0 :(得分:0)

Oracle仅读取其环境变量(包括TNS_ADMIN和NLS_LANG之类的变量)。建立连接后,将不再查询环境变量。这可能是您看到的“持久性”的来源。您需要确保在建立连接之前已定义所有环境变量,并且这些环境变量适用于您打算建立的所有连接。否则,您将需要使用某种子进程(但不能使用fork创建)。