[解決済み] SQLAlchemyによるPostgresスキーマのサポート
質問
SQLAlchemy と postgres を使ってマルチテナントのアプリをホストしています。私は、各テナントのために別々のデータベースを持つことから、複数のスキーマを持つ単一のデータベースに移行することを検討しています。SQLAlchemyはこれをネイティブにサポートしていますか?私は基本的に、すべてのクエリに、あらかじめ決められたスキーマを付加したいだけです。
select * from client1.users
ではなく、単に
select * from users
あちこちのテーブルだけでなく、特定のリクエスト/リクエストのセットのすべてのテーブルのスキーマを切り替えたいことに注意してください。
私はこれがカスタムクエリクラスで同様に達成されることを想像しますが、何かがすでにこの静脈で行われていないとは想像できません。
どのように解決するのですか?
これにはいくつかの方法があり、アプリがどのように構成されているかに依存します。 ここでは、最も基本的な方法を紹介します。
meta = MetaData(schema="client1")
あなたのアプリの実行方法が、アプリケーション全体の中で一度に1つの "クライアント"である場合、あなたは終了します。
しかし、ここで間違っているかもしれないのは、そのMetaDataからのすべてのTableがそのスキーマ上にあることです。 1 つのアプリケーションで複数のクライアントを同時にサポートしたい場合 (通常、quot; multitenant" の意味)、MetaData のコピーを作成してクライアントごとにすべてのマッピングを複製する必要があるため、扱いにくくなります。 このアプローチは、本当に必要であれば可能であり、その方法は、次のような特定のマッピングされたクラスで各クライアントにアクセスすることです。
client1_foo = Client1Foo()
で、その場合、quot;エンティティ名"のレシピで作業することになります。
http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName
と連携して
sometable.tometadata()
(参照
http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata
).
では、実際に動作する方法は、アプリ内で複数のクライアントを使用し、スレッドごとに一度に1つだけ使用することだとします。 実際、Postgresqlでそれを行う最も簡単な方法は、接続で作業を開始するときに検索パスを設定することでしょう。
# start request
# new session
sess = Session()
# set the search path
sess.execute("SET search_path TO client1")
# do stuff with session
# close it. if you're using connection pooling, the
# search path is still set up there, so you might want to
# revert it first
sess.close()
最後のアプローチは、@compiles 拡張を使用してコンパイラをオーバーライドし、ステートメント内で "schema" 名を固めることでしょう。 これは可能ですが、"Table"が生成される場所には一貫したフックがないため、厄介なことになります。 最善の策は、おそらく各リクエストで検索パスを設定することです。
関連
-
Postgresqlのデータベース権限まとめ
-
Postgresqlのデータマージ、複数のデータを1つの操作にマージする。
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] postgres: ユーザーをスーパーユーザーにアップグレードしますか?
-
[解決済み] SQLAlchemy ORDER BY DESCENDING?
-
[解決済み] SQLAlchemy: flush() と commit() の違いは何ですか?
-
[解決済み] PostgreSQL: ロールのログインが許可されていない
-
[解決済み] PostgreSQLでトリガーを一時的に無効にするにはどうすればよいですか?
-
[解決済み] 複数のデータベースをそれぞれ1つのスキーマで使用するのと、1つのデータベースを複数のスキーマで使用するのと、どちらが良いですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Postgresqlの高度なアプリケーションは、セルのアイデアをマージするの詳細
-
PostgreSQLでバッファキャッシュにデータを読み込む方法
-
どのように定期的にLinux上でpostgresqlのデータベースをバックアップする
-
Postgresqlのデータマージ、複数のデータを1つの操作にマージする。
-
Postgresqlのシーケンススキップの問題を解決する
-
PostgreSQL] アクティブリンクのあるデータベースを削除する方法
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLデータベースにアクティブな接続がある場合、そのデータベースを削除する方法は?
-
[解決済み] PostgreSQL 自動インクリメント
-
[解決済み] PostgreSQLで更新+結合を行うには?