Python - sqlalchemy - oracle连接无法连接到SID

时间:2016-04-06 15:16:53

标签: python sqlalchemy cx-oracle

我正在尝试使用sqlalchemy连接到oracle DB。我期待以下工作,因为看起来确切的语法显示在sqlalchemy documentation

oracle_db = sqlalchemy.create_engine('oracle://user:pass@server:1521/dev')

但这会导致错误:

  

dsn = self.dbapi.makedsn(url.host,port,** makedsn_kwargs)   TypeError:makedsn()不带关键字参数

以下调用最初在没有服务名称

的情况下运行
oracle_db = sqlalchemy.create_engine('oracle://user:pass@server:1521')

但是当尝试连接时失败并出现错误,抱怨未提供SERVICE_NAME

  

ORA-12504:TNS:听众没有获得CONNECT_DATA中的SERVICE_NAME

奇怪的是,这直接与cx_Oracle一起使用:

con = cx_Oracle.connect('user/pass@server:1521/dev')

我应该如何连接到特定服务?

尝试

我试图从this question明确使用cx_Oracle.makedsn()但也没有运气。

尝试在连接字符串中使用?选项

oracle_db = sqlalchemy.create_engine('oracle://user:pass@server:1521/?sid=dev')

最初有效,但当我尝试oracle_db.connect()时,我得到上面显示的ORA-12504错误。

2 个答案:

答案 0 :(得分:2)

根据Sqlalchemy Documentation的文档,您应该使用cx_oracle引擎。连接字符串是:

oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

使用service_name或sid选项,如下所示:

oracle+cx_oracle://user:pass@host:1521/?service_name=hr
oracle+cx_oracle://user:pass@host:1521/?sid=hr

答案 1 :(得分:0)

尝试使用此连接字符串:

engine = create_engine("oracle+cx_oracle://<username>:<password>@(DESCRIPTION = (LOAD_BALANCE=on) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = <host>)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = devdb)))") 

它对我有用。