Python sqlalchemy从现有的

Python sqlalchemy从现有的,python,python-3.x,sqlalchemy,Python,Python 3.x,Sqlalchemy,我有一个用例,其中超过190个表已经使用声明性的_base映射 有时,我需要为其中一些表创建“暂存”表。暂存表的结构与源表的不同之处在于,它们在源表名称前加了“stage_u”,并且没有特定字段 这是我经过反复试验后得出的结论 from sqlalchemy import Table, Column def MutateDeclarative(source): columns = [] omit_columns = ['created_at', 'updated_at']

我有一个用例,其中超过190个表已经使用声明性的_base映射

有时,我需要为其中一些表创建“暂存”表。暂存表的结构与源表的不同之处在于,它们在源表名称前加了“stage_u”,并且没有特定字段

这是我经过反复试验后得出的结论

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)
但我真的不知道我在那里做了什么,只是它起作用了。这种用法可能会产生任何意外的后果,或者是否有一种从另一个声明性类生成类的标准方法,唯一的更改是表名的更改和某些列的省略


非常感谢社区对这一点的解释。

我不知道你的意图是什么,所以我不知道是否有意外后果。不过,我觉得这完全没问题。只需为
mutatedclarative()
的每次调用创建一个新类

如果您偶然发现任何问题(“意外后果”),您也只需扩展
mutatedclarative()
来处理它

这感觉有点像python中基于原型的继承