在sqlalchemy中为同一声明性Base使用不同的模式

时间:2013-12-26 15:49:01

标签: python sqlalchemy schema pyramid

我是Pyramid和SQLAlchemy的新手。我正在使用SQLAlchemy开发Python Pyramid项目。我有一个简单的模型设置如下。如何在运行时使用不同的模式?这将是一个PostgreSQL数据库后端。现在,“公共”被硬编码到声明性基础模型中。我需要能够使用不同模式的相同模型。什么是最好的方法?除非我错过了,否则SQLAlchemy的文档对我来说似乎不清楚。

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, BigInteger

    __all__ = [
        "LoadTender"
    ]
    __all__.sort()

    Base = declarative_base()


    class LoadTender(Base):
        __tablename__ = "load_tenders"
        __table_args__ = {"schema": "public"}

        id = Column("pkey", BigInteger, primary_key=True)

        def __repr__(self):
            return "" % self.id
编辑:我似乎已经解决了我的问题,我正在更新代码段以显示我在下面所做的事情。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, BigInteger

__all__ = [
    "LoadTender"
]
__all__.sort()

Base = declarative_base()

class ClientMixin(object):
    __table_args__ = {"schema": "client_schema_name"}


class LoadTenderMixin(object):
    __tablename__ = "load_tenders"

    id = Column("pkey", BigInteger, primary_key=True)

    def __repr__(self):
        return "" % self.id


class ClientLoadTender(LoadTenderMixin, ClientMixin, Base):
    pass

3 个答案:

答案 0 :(得分:11)

我认为每个架构需要一个不同的模型。 __abstract__可以减少痛苦。接下来是Paul Yin的回答......

  1. 定义__abstract__ LoadTender模型,因此您无需继续编码。

    #base.py
    class LoadTender(Base):
        __abstract__ = True
        id = ...
        def __repr__ ...
    
  2. 在每个架构的层次结构中放置特定于架构的Base。

    #schema1.py
    from base import LoadTender
    
    PublicBase = declarative_base(metadata=MetaData(schema='public'))
    
    class LoadTender(PublicBase, LoadTender):
        __tablename__ = 'load_tenders'
    
  3. 对其他架构执行相同的操作。

答案 1 :(得分:0)

只是一个猜测

LoadTender.__table_args__["schema"] = "whatever"

可能最好把它放在app appigurator创建应用程序的地方

答案 2 :(得分:0)

您可以在包模型中使用基本模块

app\
    models\
        base.py
        schema1.py
        schema2.py
    views\
    ...

在base.py中声明Base,然后将其导入其他模式