SQLAlchemy:将表反映到显式创建的类中

时间:2016-03-31 14:39:23

标签: python database postgresql orm sqlalchemy

假设我在单个PostgreSQL数据库中有两个模式,并且每个模式都包含具有相同名称的表。例如:schema1.table,schema2.table。

我使用SQLAlchemy来处理数据库。

第一个问题是我无法将指定具体模式的数据库中的表反映到显式创建的类中。例如:

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

第二个问题是我正在寻找一种方法将一个显式创建的类与来自不同模式的表绑定,并按如下方式使用它:

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
    ...

有没有办法解决或解决所描述的问题?

1 个答案:

答案 0 :(得分:0)

SQLAlchemy Table对象允许您传递schema argument

使用声明式参数,使用Tabledocumented here传递给基础__table_args__对象。

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

您必须为不同的模式创建单独的表。