cx_Oracle 连接到 Oracle Connection Manager,无需 tnsnames.ora 文件

问题描述 投票:0回答:2

我需要通过 OCM 连接到 Oracle,非 OCM 连接看起来很简单

conn_str = 'user/password@host:port/service_name'

# oracle connection
self.con = cx_Oracle.connect(conn_str)

使用 tnsnames.ora 时也可以翻译成这样

db_alias = 
       (DESCRIPTION=               
           ) 
           (ADDRESS= 
              (PROTOCOL=TCP)(HOST=DatabaseHost)(PORT=DatabasePort) 
           ) 
           (CONNECT_DATA= 
              (SERVICE_NAME=DatabaseService)
           ) 
       )

当我们使用 tnsnames.ora 连接到 OCM 时,会添加以下内容

db_alias = 
   (DESCRIPTION= 
          ***(SOURCE_ROUTE=YES)
          (ADDRESS= 
              (PROTOCOL=TCP) (HOST=ConnectionManagerHost)(PORT=ConnectionManagerPort)***
       ) 
       (ADDRESS= 
          (PROTOCOL=TCP)(HOST=DatabaseHost)(PORT=DatabasePort) 
       ) 
       (CONNECT_DATA= 
          (SERVICE_NAME=DatabaseService)
       ) 
   )

我们如何在 python 中使用 cx_Oracle 做同样的事情?

python cx-oracle
2个回答
5
投票

[更新:cx_Oracle 已重命名为 python-oracledb。请参阅发布公告 - 使用此版本而不是 cx_Oracle。此外,旧的

makedsn()
函数已被 ConnectParams 对象废弃。]

在连接字符串中使用 TNS 别名:

conn_str = 'chris/mypassword@db_alias'  # use the entry from the tnsnames.ora file
self.con = cx_Oracle.connect(conn_str)

或使用其他形式的

connect()
的别名,如下所示:

self.con = cx_Oracle.connect(user='chris', password='mypassword', dsn='db_alias') 

如果您知道实际的连接描述符,那么您可以这样做:

cs = """(DESCRIPTION=
             (FAILOVER=on)
             (ADDRESS_LIST=
               (ADDRESS=(PROTOCOL=tcp)(HOST=sales1-svr)(PORT=1521))
               (ADDRESS=(PROTOCOL=tcp)(HOST=sales2-svr)(PORT=1521)))
             (CONNECT_DATA=(SERVICE_NAME=sales.example.com)))"""

self.con = cx_Oracle.connect(user="chris", password='mypassword', dsn=cs)

参见 连接字符串


2
投票

一个简单的命令如下:

import cx_Oracle
# Make DSN address. Real values for host address, port and service name were replaced by '<>'.
dsn = cx_Oracle.makedsn('<host_address>', '<port>', service_name='<service_name>')

# Connect to DSN
orcl = cx_Oracle.connect(user='<username>', password='<password>', dsn=dsn)
© www.soinside.com 2019 - 2024. All rights reserved.