sql >> データベース >  >> RDS >> PostgreSQL

PostgresスキーマのSQLAlchemyサポート

    これを行うにはいくつかの方法があり、アプリの構造によって異なります。最も基本的な方法は次のとおりです。

    meta = MetaData(schema="client1")
    

    アプリの実行方法が、アプリケーション全体で一度に1つの「クライアント」である場合は、これで完了です。

    しかし、ここで間違っている可能性があるのは、そのメタデータのすべてのテーブルがそのスキーマ上にあるということです。 1つのアプリケーションで複数のクライアントを同時にサポートする場合(通常は「マルチテナント」の意味)、メタデータのコピーを作成し、各クライアントのすべてのマッピングを複製する必要があるため、これは扱いにくいでしょう。このアプローチは、本当に必要な場合に実行できます。その仕組みは、次のような特定のマップされたクラスを使用して各クライアントにアクセスすることです。

    client1_foo = Client1Foo()
    

    その場合は、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拡張機能を使用してコンパイラーをオーバーライドし、ステートメント内に「スキーマ」名を固定することです。これは実行可能ですが、「テーブル」が生成されるすべての場所に一貫したフックがないため、注意が必要です。最善の策は、おそらく各リクエストに検索パスを設定することです。



    1. SQLiteビューの作成

    2. clojure.java.jdbcレイジークエリ

    3. ORA-00936:式oracleがありません

    4. MySQLで同等のDATALENGTH()とは何ですか?