我是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
答案 0 :(得分:11)
我认为每个架构需要一个不同的模型。 __abstract__
可以减少痛苦。接下来是Paul Yin的回答......
定义__abstract__
LoadTender模型,因此您无需继续编码。
#base.py
class LoadTender(Base):
__abstract__ = True
id = ...
def __repr__ ...
在每个架构的层次结构中放置特定于架构的Base。
#schema1.py
from base import LoadTender
PublicBase = declarative_base(metadata=MetaData(schema='public'))
class LoadTender(PublicBase, LoadTender):
__tablename__ = 'load_tenders'
对其他架构执行相同的操作。
答案 1 :(得分:0)
只是一个猜测
LoadTender.__table_args__["schema"] = "whatever"
可能最好把它放在app appigurator创建应用程序的地方
答案 2 :(得分:0)
您可以在包模型中使用基本模块
app\
models\
base.py
schema1.py
schema2.py
views\
...
在base.py中声明Base
,然后将其导入其他模式