29

您如何通过 IP 地址连接到远程服务器,就像 TOAD、SqlDeveloper 能够仅使用 IP 地址、用户名、SID 和密码连接到数据库一样?

每当我尝试指定 IP 地址时,它似乎都在本地使用。

换句话说,cx_Oracle.connect() 的字符串应该如何格式化为非本地数据库?

之前有一篇文章列出了通过 cx_Oracle 模块连接到 Oracle 的答案,代码如下:

#!/usr/bin/python

import cx_Oracle
connstr='scott/tiger'
conn = cx_Oracle.connect(connstr)
curs = conn.cursor()

curs.execute('select * from emp')
print curs.description
for row in curs:
    print row
conn.close()
4

6 回答 6

61

我喜欢这样做:

ip = '192.168.0.1'
port = 1521
SID = 'YOURSIDHERE'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)

db = cx_Oracle.connect('username', 'password', dsn_tns)

我喜欢这种方法的主要原因之一是我通常在某个地方有一个 TNSNAMES.ORA 文件,我可以通过以下操作检查dsn_tns对象是否会做正确的事情:

print dsn_tns

并将输出与我的 TNSNAMES.ORA 进行比较

于 2009-12-09T00:27:27.430 回答
29

您可以在连接字符串中指定服务器,例如:

import cx_Oracle
connstr = 'scott/tiger@server:1521/orcl'
conn = cx_Oracle.connect(connstr)
  • “server”是服务器,如果需要,也可以是 IP 地址。
  • “1521”是数据库正在侦听的端口。
  • “orcl”是实例(或数据库服务)的名称。
于 2009-07-25T09:18:09.707 回答
9
import cx_Oracle

CONN_INFO = {
    'host': 'xxx.xx.xxx.x',
    'port': 12345,
    'user': 'user_name',
    'psw': 'your_password',
    'service': 'abc.xyz.com',
}

CONN_STR = '{user}/{psw}@{host}:{port}/{service}'.format(**CONN_INFO)

connection = cx_Oracle.connect(CONN_STR)
于 2018-06-17T13:28:57.137 回答
2

您可以创建一个 dsn 并通过 service_name 连接,而不是指定 SID,例如:

import cx_Oracle
ip = '192.168.0.1'
port = 1521
service_name = 'my_service'
dsn = cx_Oracle.makedsn(ip, port, service_name=service_name)

db = cx_Oracle.connect('user', 'password', dsn)

使用服务名称而不是特定实例标识符 (SID) 的好处是它也可以在 RAC 环境中工作(使用 SID 不会)。此参数自cx_Oracle 版本 5.1.1(2011 年 8 月 28 日)起可用

于 2016-10-11T18:45:14.800 回答
1
import cx_Oracle
dsn = cx_Oracle.makedsn(host='127.0.0.1', port=1521, sid='your_sid')
conn = cx_Oracle.connect(user='your_username', password='your_password', dsn=dsn)
conn.close()
于 2019-09-18T03:24:11.390 回答
-1
import cx_Oracle
ip = '172.30.1.234'
port = 1524
SID = 'dev3'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)

conn = cx_Oracle.connect('dbmylike', 'pass', dsn_tns)
print conn.version
conn.close()
于 2018-02-22T03:27:31.280 回答