【问题标题】:cx_Oracle Am I using the host name incorrectly?cx_Oracle 我是否错误地使用了主机名?
【发布时间】:2019-06-26 11:22:54
【问题描述】:

我使用 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

【问题讨论】:

  • print(CONN_STR) 而不是 test2 会更有趣……给出的错误表明生成的 CONN_STR 不是它所需要的(说明显而易见)。第一个 CONN_INFO 中的反斜杠对我来说看起来不太好……您从 Toad 获取的内容真的是服务器主机还是 tnsnames.ora 的 TNS 名称?看看this answer 是否能以某种方式帮助你——从那里的答案来看,如果连接数据正确,你的第二个字符串应该没问题。
  • @ShinTakezou 我也试过了,但它从不打印。就像它挂了一样。也就是说,我首先使用makedsn() 解决了这个问题,然后连接这些设置。

标签: python oracle cx-oracle


【解决方案1】:

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

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)))>

【讨论】:

  • 在调用 makedsn 后添加 print(or_dns)。输出是一个看起来像 tnsnames.ora 条目的字符串。我想知道这是否是一个 cx_oracle 错误。这个页面让你认为它应该像你最初那样工作。 oracle.com/technetwork/articles/dsl/python-091105.html
  • @BobbyDurrett 我必须在星期一离开办公室时检查一下。
  • 不用担心。看起来用 IP 地址替换主机名是可行的。周末愉快。
【解决方案2】:

我必须做两件事才能让您的示例在我的笔记本电脑上运行。

我必须更新我的 sqlnet.ora 才能拥有这一行:

names.directory_path = (TNSNAMES,EZCONNECT)

而不是

names.directory_path = (TNSNAMES)

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

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

鲍比

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多