SQLAlchemy Mass-Column Creation

时间:2013-06-12 15:31:41

标签: python sqlalchemy metaprogramming

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

channel_51, channel_52 ... channel_272, channel_273

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

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

除了它需要在班级的顶层工作

1 个答案:

答案 0 :(得分: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)
相关问题