3

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

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

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?

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

4

4 に答える 4

3

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

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

オブジェクト リレーショナル マッピングを行いたい場合は、SQLAlchemy がビジネスを行います。独自の宣言構文、またはSQLAlchemy の上に位置し、より一般的なユースケースで使いやすさを向上させるElixirなどの別のレイヤーのいずれかを検討できます。 .

于 2009-07-18T21:30:47.017 に答える
1

Python でこれを行う「正しい」方法はないと思います。ただし、さらに一歩進んで、自分とデータベースの間に別のレイヤーを使用する必要があります。

DataSource の概念 (Java でしか出会ったことがない) を使用したい理由によっては、SQLAlchemy (または同様のもの) を使用すると、最初から何かを作成する必要がなく、問題が解決する場合があります。

それがうまくいかない場合は、独自のラッパーを作成するのが合理的な解決策のように思えます。

于 2009-07-18T20:50:45.600 に答える
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/secret@oracletestdb")

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

(注意してください、これは単純なバージョンです。multidb 対応のコードには、このロジックを内部に持つ dbconnection クラスがあります。)

于 2009-07-19T00:50:08.700 に答える
0

私はそれを吸い上げて、自分で書きました。データベース (Oracle/MySQL/Access/etc) の抽象化、ログの追加、トランザクション ロールバックによるエラー処理などを追加することができました。

于 2009-07-21T02:28:17.563 に答える