【问题标题】:SQLAlchemy Mass-Column CreationSQLAlchemy 质量列创建
【发布时间】:2013-06-08 19:13:52
【问题描述】:

所以我有一个关于声明性 SQLAlchemy 的有趣用例:我需要定义大约十个不同的 sqlalchemy 类,每个类有几百列。但是,这些对象本质上将存储一个数据“通道”数组,因此列将被命名:

channel_51, channel_52 ... channel_272, channel_273

我可以使用声明的类维护一个巨大的文件,但每个类将始终是 channel_n 到 channel_m 的那种形式。有没有办法把它变成每个类的几行代码而不是 300 行?挑战在于它们需要在顶层定义以便对metadata.create_all() 函数可见,并且不能在初始化期间添加到类中。我想要相当于:

for i in range(n,m):
    setattr(self, 'channel_%d' %i, Column(sqlalchemy.types.Float))

除了它需要在类的顶层工作

【问题讨论】:

    标签: python sqlalchemy metaprogramming


    【解决方案1】:

    最直接的就是使用Table,因为它已经是函数调用接口了:

    class MyClass(Base):
        __table__ = Table('mytable', Base.metadata, 
                          Column('x', Integer, primary_key=True),
                          *[Column("channel_%d" % i, Float) for i in range(51, 273)]
                    )
    

    但如果您想使用函数调用接口创建 Python 类,请使用type()

    cols = dict(("channel_%d" % i, Column(Float)) for in range(51, 273))
    cls_dict = {"__tablename__": "mytable", "id": Column('x', Integer, primary_key=True)}
    cls_dict.update(cols)
    MyClass = type("MyClass", (Base, ), cls_dict)
    

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2018-04-06
      相关资源
      最近更新 更多