私は、外部アプリケーションからのデータで事前に作成された複数のsqlite3データベースを使用するアプリケーションを実行しています。各データベースは全く同じテーブルを持ちますが、データは異なります。実行時にTG2のデータベースを切り替える
ユーザーの入力に応じてこれらのデータベースを切り替えることができます。 TurboGears 2でこれを行う最もエレガントな方法は何ですか?
私は、外部アプリケーションからのデータで事前に作成された複数のsqlite3データベースを使用するアプリケーションを実行しています。各データベースは全く同じテーブルを持ちますが、データは異なります。実行時にTG2のデータベースを切り替える
ユーザーの入力に応じてこれらのデータベースを切り替えることができます。 TurboGears 2でこれを行う最もエレガントな方法は何ですか?
すべてのデータベースが同じスキーマを持つ場合、同じモデルを使用して異なるデータベースに複数のセッションを作成できるはずです。
Dzhelil、
私はしばらく前にTG2で複数のデータベースを使用する方法についてのブログ記事を書きました。このメソッドとJorgeの提案する複数のDBSessionを組み合わせることができます。これを簡単に実行できると思います。このことができます
How to use multiple databases in TurboGears 2.0
希望、私は読み取り専用アプリケーションのための2つのデータベースを使用しています セス
。 2番目のデータベースは、プライマリ・データベースが停止している場合のキャッシュです。 2つのオブジェクトを使用して、接続、メタデータ、互換性のあるTable
インスタンスを保持します。ビュー関数の先頭にはdb = primary
またはdb = secondary
が割り当てられ、残りはdb.tableA.join(db.tableB)
に対するクエリになります。私はORMを使用していません。
スキーマは厳密に同一ではありません。プライマリデータベースにはschema.
の接頭辞(Table(...schema='schema')
)が必要で、キャッシュデータベースには含まれません。この問題を回避するために、スキーマ名を引数とする関数でテーブルオブジェクトを作成します。各データベースに対して関数を一度呼び出すことによって、私は互換性のある接頭辞と接頭辞を持たないTable
オブジェクトを作成します。
少なくともPylonsでは、SQLAlchemy meta.Session
はScopedSession
です。アプリケーションのBaseController
のappname/lib/base.py
は、各要求後にSession.remove()
と呼び出します。両方のデータベースと通信するSession
を1つだけ持っているほうがよいでしょうが、そうでない場合は、それぞれを変更して、それぞれに.remove()
を呼び出す必要があります。
他のほとんどのデザインがこれより優れています。なぜ、複数のソースから単一のデータベースをロードできないのですか? –
または、現在のデータベースに外部データベースを接続します。これにより、同じ接続にあるように、異なる名前空間にあるように動作します。 – Christopher
すべてを1つのデータベースにロードするには、スキーマを変更する必要があります。他のアプリケーションがそのスキーマに依存しているため、スキーマを変更することはできません。 ATTACHの提案は興味深いように聞こえますが、私の場合はそれを動作させる方法は考えられません。私はモデルを宣言的に構築するためにsqlalchemyに依存しており、各モデルクラスはタブ名に関連付けられています。同じデータベースを接続するには、各tablenameの前に識別子を付ける必要があります。この識別子はsqlalchemyを破ります。 – dzhelil