2009-07-07 12 views
1

私は、外部アプリケーションからのデータで事前に作成された複数のsqlite3データベースを使用するアプリケーションを実行しています。各データベースは全く同じテーブルを持ちますが、データは異なります。実行時にTG2のデータベースを切り替える

ユーザーの入力に応じてこれらのデータベースを切り替えることができます。 TurboGears 2でこれを行う最もエレガントな方法は何ですか?

+0

他のほとんどのデザインがこれより優れています。なぜ、複数のソースから単一のデータベースをロードできないのですか? –

+0

または、現在のデータベースに外部データベースを接続します。これにより、同じ接続にあるように、異なる名前空間にあるように動作します。 – Christopher

+0

すべてを1つのデータベースにロードするには、スキーマを変更する必要があります。他のアプリケーションがそのスキーマに依存しているため、スキーマを変更することはできません。 ATTACHの提案は興味深いように聞こえますが、私の場合はそれを動作させる方法は考えられません。私はモデルを宣言的に構築するためにsqlalchemyに依存しており、各モデルクラスはタブ名に関連付けられています。同じデータベースを接続するには、各tablenameの前に識別子を付ける必要があります。この識別子はsqlalchemyを破ります。 – dzhelil

答えて

1

すべてのデータベースが同じスキーマを持つ場合、同じモデルを使用して異なるデータベースに複数のセッションを作成できるはずです。

1

Dzhelil、

私はしばらく前にTG2で複数のデータベースを使用する方法についてのブログ記事を書きました。このメソッドとJorgeの提案する複数のDBSessionを組み合わせることができます。これを簡単に実行できると思います。このことができます

How to use multiple databases in TurboGears 2.0

希望、私は読み取り専用アプリケーションのための2つのデータベースを使用しています セス

1

。 2番目のデータベースは、プライマリ・データベースが停止している場合のキャッシュです。 2つのオブジェクトを使用して、接続、メタデータ、互換性のあるTableインスタンスを保持します。ビュー関数の先頭にはdb = primaryまたはdb = secondaryが割り当てられ、残りはdb.tableA.join(db.tableB)に対するクエリになります。私はORMを使用していません。

スキーマは厳密に同一ではありません。プライマリデータベースにはschema.の接頭辞(Table(...schema='schema'))が必要で、キャッシュデータベースには含まれません。この問題を回避するために、スキーマ名を引数とする関数でテーブルオブジェクトを作成します。各データベースに対して関数を一度呼び出すことによって、私は互換性のある接頭辞と接頭辞を持たないTableオブジェクトを作成します。

少なくともPylonsでは、SQLAlchemy meta.SessionScopedSessionです。アプリケーションのBaseControllerappname/lib/base.pyは、各要求後にSession.remove()と呼び出します。両方のデータベースと通信するSessionを1つだけ持っているほうがよいでしょうが、そうでない場合は、それぞれを変更して、それぞれに.remove()を呼び出す必要があります。

関連する問題