我需要通过 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 做同样的事情?
[更新: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)
参见 连接字符串
一个简单的命令如下:
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)