Using a different schema for the same declarative Base in sqlalchemy
我对金字塔和炼金术都不熟悉。我正在用sqlacalchemy开发一个python金字塔项目。我在下面建立了一个简单的模型。如何在运行时将其用于不同的模式?这将是一个PostgreSQL数据库后端。现在,"public"被硬编码到声明性基础模型中。我需要能够将这个相同的模型用于不同的模式。最好的方法是什么?除非我错过了,否则sqlacalchemy的文档对我来说似乎不清楚。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 |
编辑:我似乎已经解决了我的问题,我正在更新代码片段以显示我在下面做了什么。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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 |
号
我认为每个模式需要不同的模型。
定义一个
1 2 3 4 5 | #base.py class LoadTender(Base): __abstract__ = True id = ... def __repr__ ... |
为每个架构在层次结构中放置一个特定于架构的基。
1 2 3 4 5 6 7 | #schema1.py from base import LoadTender PublicBase = declarative_base(metadata=MetaData(schema='public')) class LoadTender(PublicBase, LoadTender): __tablename__ = 'load_tenders' |
。
对其他模式执行相同的操作。
在包模型中可以有一个基本模块
1 2 3 4 5 6 7 | app\ models\ base.py schema1.py schema2.py views\ ... |
号
在base.py中声明
只是个猜测
1 | LoadTender.__table_args__["schema"] ="whatever" |
最好把它放在应用程序配置程序创建应用程序的地方。