我正在尝试使用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
错误。
答案 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)))")
它对我有用。