2016-04-06 47 views
1

sqlalchemyを使用してOracle DBに接続しようとしています。正確な構文がsqlalchemy documentationに表示されているとすれば、私は次のことを期待していました。Python - sqlalchemy - Oracle接続がSIDへの接続に失敗する

oracle_db = sqlalchemy.create_engine('oracle://user:[email protected]:1521/dev') 

が、これはエラーになり:

dsn = self.dbapi.makedsn(url.host, port, **makedsn_kwargs) TypeError: makedsn() takes no keyword arguments

次の呼び出しは、最初にサービス名

oracle_db = sqlalchemy.create_engine('oracle://user:[email protected]:1521') 

せずに動作しますが、接続しようとすると、それがあることを訴えてエラーで失敗しますSERVICE_NAMEは提供されませんでした。

ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

奇妙なことに、これは直接cx_Oracleで動作します:

con = cx_Oracle.connect('user/[email protected]:1521/dev') 

はどのようにして、特定のサービスに接続することが出来るのですか?私も運とthis questionから明示的にcx_Oracle.makedsn()を使用しようとしました

試み

oracle_db = sqlalchemy.create_engine('oracle://user:[email protected]:1521/?sid=dev') 

作品最初は接続文字列で?オプションを使用しようとするが、私はoracle_db.connect()をしようとすると、私は上記のように同じORA-12504エラーを取得します。

答えて

1

Sqlalchemy Documentationのドキュメントに基づいて、おそらくcx_oracleエンジンを使用する必要があります。接続文字列は次のとおりです。

​​

SERVICE_NAMEまたはSIDのオプションで次のように:

oracle+cx_oracle://user:[email protected]:1521/?service_name=hr 
oracle+cx_oracle://user:[email protected]:1521/?sid=hr 
+0

私は両方を試してみました。最初に 'TypeError:makedsn()はキーワード引数を取らず'となり、 'connect 'しようとすると' SERVICE_NAME'エラーが返されませんでした。 – cdeterman

+0

実際にtns_namesエントリ。例については、[http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html]を参照してください。 –

+0

tns_namesは機能するかもしれませんが、すぐに利用できるものはありません。私はなぜ 'cx_Oracle'に直接近い文字列が' sqlalchemy'に渡されたのか理解できません。 – cdeterman

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

それは私のために働きました。

関連する問題