外部アプリケーションからのデータが事前に入力された、複数の sqlite3 データベースを使用するアプリケーションを実行しています。各データベースにはまったく同じテーブルがありますが、データは異なります。
ユーザー入力に応じてこれらのデータベースを切り替えることができるようにしたいと考えています。TurboGears 2 でそれを行う最もエレガントな方法は何ですか?
外部アプリケーションからのデータが事前に入力された、複数の sqlite3 データベースを使用するアプリケーションを実行しています。各データベースにはまったく同じテーブルがありますが、データは異なります。
ユーザー入力に応じてこれらのデータベースを切り替えることができるようにしたいと考えています。TurboGears 2 でそれを行う最もエレガントな方法は何ですか?
ジェリル、
TG2 で複数のデータベースを使用することについて、しばらく前にブログ投稿を書きました。この方法を複数の DBSession に関する Jorge の提案と組み合わせることができます。これは簡単に実行できると思います。
TurboGears 2.0 で複数のデータベースを使用する方法
これが役に立てば幸いです、セス
すべてのデータベースが同じスキーマを持っている場合、異なる DB に対して同じモデルを使用して複数のセッションを作成できるはずです。
読み取り専用アプリケーションに 2 つのデータベースを使用しています。2 番目のデータベースは、プライマリ データベースがダウンした場合のキャッシュです。接続、メタデータ、および互換性のあるTable
インスタンスを保持するために、2 つのオブジェクトを使用します。db = primary
ビュー関数の先頭はorを割り当てdb = secondary
、残りは単に に対するクエリですdb.tableA.join(db.tableB)
。私はORMを使用していません。
スキーマは厳密には同一ではありません。プライマリ データベースにはschema.
プレフィックス ( Table(...schema='schema')
) が必要ですが、キャッシュ データベースには必要ありません。これを回避するために、スキーマ名を引数として受け取る関数でテーブル オブジェクトを作成します。この関数をデータベースごとに 1 回呼び出すことで、互換性のあるプレフィックス付きオブジェクトとプレフィックスなしTable
オブジェクトを取得できます。
少なくとも Pylons では、SQLAlchemymeta.Session
はScopedSession
. アプリケーションは、各リクエストの後BaseController
にappname/lib/base.py
呼び出し中です。Session.remove()
両方のデータベースと通信する単一のSession
を用意したほうがよいでしょうが、そうでない場合は、それぞれBaseController
を呼び出すように を変更する必要があるかもしれません。.remove()
Session