我对金字塔和炼金术都不熟悉。我正在用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/