2009-07-18 7 views
3

Java DataSourceに実装されているデータベースアクセスのためのJavaパラダイムがあります。このオブジェクトは、データベース接続の作成に関する有用な抽象化を作成します。 DataSourceオブジェクトはデータベース構成を保持しますが、要求に応じてデータベース接続を作成します。これにより、すべてのデータベース構成と初期化コードを1か所に保存し、データベースの実装を簡単に変更したり、テスト用の疑似データベースを使用したりすることができます。cx_Oracleとデータソースのパラダイム

私は現在、cx_Oracleを使用しているPythonプロジェクトに取り組んでいます。 cx_Oracleでは、1モジュールから直接接続を取得します。

import cx_Oracle as dbapi 
connection = dbapi.connect(connection_string) 
# At this point I am assuming that a real connection has been made to the database. 
# Is this true? 

私はcx_OracleでDataSourceに平行を見つけようとしています。私は簡単に新しいクラスを作成し、cx_Oracleをラップすることでこれを作成できますが、これがPythonで行う正しい方法であると思っていました。

答えて

3

PEP-249: Python Database API Specification v2.0を見て、Pythonでデータベースにアクセスする方法に関する関連情報を見つけることができます。 cx_Oracleは、この仕様に準拠しており、Python用の多くのデータベースドライバと同様です。

この仕様では、Connectionオブジェクトはデータベース接続を表しますが、組み込みプーリングはありません。 SQLAlchemyのようなツールはプーリング機能を提供しますが、SQLAlchemyはORMとして課金されることが多くありますが、SQLエンジンの上で使用するための素晴らしい抽象概念を提供する必要はありません。

オブジェクトリレーショナルマッピングを実行する場合は、SQLAlchemyがビジネスを行い、独自の宣言構文またはElixirのような別の層をSQLAlchemyの上に置くことができます。より一般的な使用例

1

私は、Pythonでこれを行う「正しい」方法はないと思います。一歩進んで自分自身とデータベースの間に別のレイヤーを使用することを除いては。

DataSourceのコンセプト(私はJavaでしか見たことがない)を使用したい理由によって、SQLAlchemy(または類似のもの)が問題を解決するかもしれません。

これが法案に適合しない場合、独自のラッパーを書くことは妥当な解決策のように聞こえます。

0

はい、Pythonにも同様の抽象化があります。

これはローカルビルド回帰テストの結果です。ここでは、新しいPythonをビルドするたびにすべてのデータベースと話すことができます。

if database == SYBASE: 
    import Sybase 
    conn = Sybase.connect('sybasetestdb','mh','secret') 
elif database == POSTRESQL: 
    import pgdb 
    conn = pgdb.connect('pgtestdb:mh:secret') 
elif database == ORACLE: 
    import cx_Oracle 
    conn = cx_Oracle.connect("mh/[email protected]") 

curs=conn.cursor() 
curs.execute('select a,b from testtable') 
for row in curs.fetchall(): 
    print row 

(ノートでは、これが私たちのmultidb対応のコードでは、我々は内部にこのロジックを持っているのDBConnectionクラスを持って、シンプルなバージョンです。)私はちょうどそれを吸い上げ、私自身が書いた

0

。データベース(Oracle/MySQL/Access/etc)の抽象化、ロギングの追加、トランザクションのロールバックによるエラー処理などを追加することができました。