在连接字符串上使用SID而不是服务名时,cx_Oracle不会连接

And*_*ndy 31 python oracle cx-oracle python-2.7

我有一个看起来像这样的连接字符串

con_str = "myuser/mypass@oracle.sub.example.com:1521/ora1"
Run Code Online (Sandbox Code Playgroud)

ora1我的数据库的SID 在哪里.在SQL Developer中使用此信息工作正常,这意味着我可以毫无问题地连接和查询.

但是,如果我尝试使用此字符串连接到Oracle,则会失败.

cx_Oracle.connect(con_str)

DatabaseError:  ORA-12514:  TNS:listener  does  not  currently  know  of  service  requested  in  connect  descriptor
Run Code Online (Sandbox Code Playgroud)

ora1但是,如果是服务名称,则此连接字符串格式有效.

我看到其他问题似乎与我的问题相反(它适用于SID,但不适用于服务名称)

使用cx_Oracle,SID而不是服务名称连接到Oracle的正确方法是什么?如何在不调整TNSNAMES.ORA文件的情况下执行此操作?我的应用程序在内部分发给许多用户,并且TNSNAMES在处理没有Windows机器管理员权限的用户时,对文件进行更改并不理想.此外,当我使用服务名称时,我根本不需要触摸此文件,并希望它保持这种方式.

And*_*ter 51

我是一个类似的场景,我能够通过使用cx_Oracle.makedsn()创建一个给定(而不是服务名称)的dsn字符串连接到数据库SID:

dsnStr = cx_Oracle.makedsn("oracle.sub.example.com", "1521", "ora1")
Run Code Online (Sandbox Code Playgroud)

这会返回类似的内容

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle.sub.example.com)(PORT=1521)))(CONNECT_DATA=(SID=ora1)))
Run Code Online (Sandbox Code Playgroud)

然后可以用来cx_Oracle.connect()连接数据库:

con = cx_Oracle.connect(user="myuser", password="mypass", dsn=dsnStr)
print con.version
con.close()
Run Code Online (Sandbox Code Playgroud)

  • 文档非常清楚.只需执行`cx_Oracle.makedsn("oracle.sub.example.com","1521",service_name ="ora1")`,明确使用关键字`service_name`将其与第三个参数(即`sid`)区分开来. (3认同)
  • 非常有用,经过 2 天的搜索到达这里,不到 30 秒就成功了。了不起。非常感谢@Andreas Fester。 (2认同)

Pio*_*ost 7

对于那些正在寻找如何指定service_name而不是 SID 的人。

来自SQLAlchemy 1.0.0b1 的变更日志(2015 年 3 月 13 日发布):

[oracle] [功能] 通过传递?service_name=<name>到 URL ,添加了对特定服务名称的 cx_oracle 连接的支持,而不是 tns 名称 。拉取请求由 S?awomir Ehlert 提供。

该更改引入了新的 Oracle 方言特定选项service_name,可用于构建连接字符串,如下所示:

from sqlalchemy import create_engine
from sqlalchemy.engine import url

connect_url = url.URL(
    'oracle+cx_oracle',
    username='some_username',
    password='some_password',
    host='some_host',
    port='some_port',
    query=dict(service_name='some_oracle_service_name'))

engine = create_engine(connect_url)
Run Code Online (Sandbox Code Playgroud)