cx_Oracle我使用的主机名不正确吗?

时间:2019-02-01 20:53:10

标签: python oracle cx-oracle

我使用Toad连接到我的Oracle数据库,并且工作正常,但是我尝试使用cx_Oracle连接到相同的数据库,并且程序陷入了.connect()方法的局面。

我相信问题是host的名称,但是我不能确定,因为没有错误,只是没有通过connect()调用。

import cx_Oracle


CONN_INFO = {'host': '\\\\SERVERNAMEUSEDINTOAD\\',
             'port': 1111,
             'user': 'USER123',
             'psw': 'password',
             'service': 'dbname.somesite.com'}
print("test1")
CONN_STR = '{user}/{psw}@{host}:{port}/{service}'.format(**CONN_INFO)
print("test2")
con = cx_Oracle.connect(CONN_STR)
print("test3")
print(con.fetchmany([1]))

控制台:

test1
test2

我到达test2,但没有到达test3。我使用的主机名正确吗?主机是网络上的内部服务器。

TOAD应用程序仅显示SERVERNAMEUSEDINTOAD,所以我也尝试这样做:

'host': 'SERVERNAMEUSEDINTOAD'

但这会导致以下错误:

test1
test2
Traceback (most recent call last):
  File "C:/Users/name/PycharmProjects/WorkFlow/test.py", line 12, in <module>
    con = cx_Oracle.connect(CONN_STR)
cx_Oracle.DatabaseError: ORA-12154: TNS:could not resolve the connect identifier specified

2 个答案:

答案 0 :(得分:0)

经过一番挖掘,我发现了这篇文章:

cx_Oracle doesn't connect when using SID instead of service name on connection string

以为是与SID连接的,有一条帖子建议使用makedsn(),然后用它来连接。

结果证明,通过service_name连接也解决了我的问题。

我在这里发布我的解决方案,因此任何发现此帖子的人都可以选择解决此问题。

import cx_Oracle

or_dns = cx_Oracle.makedsn('SERVERNAMEUSEDINTOAD', 1111, service_name='dbname.somesite.com')

con = cx_Oracle.connect(user="USER123", password="password", dsn=or_dns)
print(con)

控制台:

<cx_Oracle.Connection to USER123@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SERVERNAMEUSEDINTOAD)(PORT=1111))(CONNECT_DATA=(SERVICE_NAME=dbname.somesite.com)))>

答案 1 :(得分:0)

我必须做两件事才能使您的示例在笔记本电脑上工作。

我必须更新我的sqlnet.ora以具有以下行:

names.directory_path =(TNSNAMES,EZCONNECT)

代替

names.directory_path =(TNSNAMES)

然后我必须使用主机的IP地址而不是主机名。

我不认为这是cx_oracle中的错误,因为sqlplus不能使用相同的语法。但是,它可以与我的sqlnet.ora中的IP地址和EZCONNECT一起使用。

鲍比