2013-06-12 69 views
0

所以我對聲明性SQLAlchemy有一個有趣的用例:我需要定義大約十個不同的sqlalchemy類,每個類有幾百列。然而,這些對象將主要存儲數據的「通道」的排列,因此列將被命名爲:SQLAlchemy Mass-Column Creation

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)) 

除了它需要在類的頂級合作

回答

1

最直接的方法是使用一個表,因爲它已經是一個函數調用接口:

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)