2016-03-31 17 views
0

1つのPostgreSQLデータベースに2つのスキーマがあり、各スキ​​ーマに同じ名前のテーブルが含まれているとします。たとえば、schema1.table、schema2.tableなどです。SQLAlchemy:明示的に作成されたクラスにテーブルを反映

データベースの操作にSQLAlchemyを使用します。

最初の問題は、明示的に作成されたクラスに具体的なスキーマを指定してデータベースからテーブルを反映できないことです。たとえば:

session = Session() 
with schema_context('schema1'): 
    data = session.query(Table).all() # Table refers to schema1.table 
    ... 

with schema_context('schema2'): 
    data = session.query(Table).all() # Table refers to schema2.table 
    ... 

はにはいくつかの方法があります:

from sqlalchemy import create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.ext.declarative import DeferredReflection 

Base = declarative_base() 

class Table(DeferredReflection, Base): 
    __tablename__ = 'table' 

## somehow specify schema for table 

engine = create_engine(
    'postgresql+psycopg2://localhost/postgres', 
    isolation_level='READ UNCOMMITTED' 
) 

DeferredReflection.prepare(engine) 

## do something using reflected table 

第二の問題は、次のように私は別のスキーマからテーブルを1つの明示的に作成したクラスをバインドし、それを使用する方法を探していますということです説明した問題を回避するか解決しますか?

答えて

0

SQLAlchemy Tableオブジェクトを使用すると、schema argumentを渡すことができます。

宣言型を使用すると、引数は__table_args__を使用してdocumented hereというオブジェクトを使用して、基底のTableオブジェクトに渡されます。

class MyTable(DeferredReflection, Base): 
    __tablename__ = 'my_table' 
    __table_args__ = {'schema': 'schema2'} 

異なるスキーマ用に別々の表を作成する必要があります。

関連する問題