【问题标题】:sqlalchemy construct new declarative class from existingsqlalchemy 从现有的构造新的声明类
【发布时间】: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


    【解决方案1】:

    我不确切知道你的意图是什么,所以我无法判断是否有意想不到的后果。然而,这对我来说看起来完全没问题。您只需为MutateDeclarative() 的每个调用创建一个新类。

    如果您偶然发现任何问题(“意外后果”),您也只需扩展您的 MutateDeclarative() 即可处理它。

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

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 1970-01-01
      • 2011-03-23
      • 2019-11-28
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多