cx_Oracleとデータ・ソースのパラダイム
質問
のJava DataSource
に実装されたデータベースにアクセスするためのJavaのパラダイムがあります。このオブジェクトは、データベース接続の作成の周りに便利な抽象化を作成します。 DataSource
オブジェクトは、データベースの設定を保持しますが、唯一のリクエストに応じてデータベース接続を作成します。これは、あなたが一箇所ですべてのデータベースの設定と初期化コードを維持することができますし、それが簡単にデータベースの実装を変更、またはテスト用モックデータベースを使用できるようになりますされます。
私は現在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でそれを行うための正しい方法である場合、私は思っていた。
解決
あなたはを見て、Pythonでデータベースにアクセスする方法の関連情報を見つけることができますPEP-249:PythonのデータベースAPI仕様v2.0のに。 Pythonのための多くのデータベースドライバがそうであるようにcx_Oracle
は、この仕様に準拠しています。
この明細書でConnection
オブジェクトは、データベース接続を表すが、組み込みのプーリングはありません。このよう SQLAlchemyののなどのツールは、プール施設を提供しない、とSQLAlchemyのは、多くの場合、ORMと銘打たれているが、それはありません。などとSQLエンジンの上に使用するために素敵な抽象化を提供していますとして使用することができます。
、その後、SQLAlchemyの事業を行い、そしてあなたは、このような<のhref = "http://elixir.ematia.de/として、独自の宣言構文または他の層のいずれかを考えることができます「REL =」nofollowをnoreferrer "> SQLAlchemyの上に位置し、より一般的なユースケースのための使いやすさの増加をもたらす。エリクサーの
他のヒント
多分さらに一歩進めて、自分自身とデータベースの間に別の層を使用することを除いて、私は、Pythonでこれを行うには「正しい」方法はないと思います。
(私はこれまで、Javaで遭遇しました)データソースの概念を使用したい理由によっては、SQLAlchemyの(または類似したもの)を使用すると、ゼロから何かを記述することなく、あなたのための問題を解決する可能性があります。
それが法案に適合しない場合は、、独自のラッパーを書くことは合理的な解決策のように聞こえるます。
はい、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/secret@oracletestdb")
curs=conn.cursor()
curs.execute('select a,b from testtable')
for row in curs.fetchall():
print row
(注意、これは我々が内部このロジックを持っているのDBConnectionクラスを持っている私たちのmultidb対応のコードでは、簡易版です。)
私はちょうどそれを吸い上げ、私自身が書きました。それは私が、エラーがトランザクションのロールバックなどを取り扱い、データベース(オラクル/ MySQLの/アクセス/など)を抽象化し、ロギングを追加するようなものを追加することができます。