我对金字塔和炼金术都不熟悉。我正在用sqlacalchemy开发一个python金字塔项目。我在下面建立了一个简单的模型。如何在运行时将其用于不同的模式?这将是一个PostgreSQL数据库后端。现在,“public”被硬编码到声明性基础模型中。我需要能够将这个相同的模型用于不同的模式。最好的方法是什么?除非我错过了,否则sqlacalchemy的文档对我来说似乎不清楚。

    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

最佳答案

我认为每个模式需要不同的模型。__abstract__可以减轻这种痛苦。这是保罗尹的回答…
定义一个__abstract__loadTender模型,这样就不必一直对其进行编码。

#base.py
class LoadTender(Base):
    __abstract__ = True
    id = ...
    def __repr__ ...

为每个架构在层次结构中放置一个特定于架构的基。
#schema1.py
from base import LoadTender

PublicBase = declarative_base(metadata=MetaData(schema='public'))

class LoadTender(PublicBase, LoadTender):
    __tablename__ = 'load_tenders'

对其他模式执行相同的操作。

关于python - 在sqlalchemy中为同一声明性Base使用不同的模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20787457/

10-11 09:21