【发布时间】:2014-07-22 16:47:50
【问题描述】:
我有一个用例,其中已经使用 declarative_base 映射了超过 190 个表。
有时我需要为其中一些表创建“临时”表。暂存表的结构与源表的不同之处在于它们在源表名称前附加了“stage_”,并且它们没有某些字段。
这是我经过反复试验后得出的结论。
from sqlalchemy import Table, Column
def MutateDeclarative(source):
columns = []
omit_columns = ['created_at', 'updated_at']
for c in source.__table__.c:
if c.name not in omit_columns:
columns.append(((c.name,
c.type),
{'primary_key': c.primary_key,
'nullable': c.nullable,
'doc': c.doc,
'default': c.default,
'unique': c.unique,
'autoincrement': c.autoincrement}))
class Stage(Base):
__tablename__ = 'stage_' + source.__tablename__
__table__ = Table('stage_' + source.__tablename__,
Base.metadata, *[Column(*c[0], **c[1]) for c in columns])
return Stage
这段代码有效。我可以这样称呼它
from models import Customer
MutatedCustomer = MutateDeclarative(Customer)
但我真的不知道我在那里做了什么,只是它有效。这种用法是否会产生任何意想不到的后果,或者是否有一种标准方法可以从另一个声明性类生成一个类,唯一的变化是表名的变化和一些列的省略。
非常感谢社区对此的解释。
【问题讨论】:
标签: python python-3.x sqlalchemy