2011-09-05 70 views
1

我有很多列的表 -SQLAlchemy的查询动力场

class Dummy(object): 
    __tablename__ = 'dummies' 
    c1 = Column(Integer) 
    c2 = Column(Integer) 
    c3 = Column(Integer) 
    ... 
    cN = Column(Integer) 

我可以查询通过单独无需手动指定每个列名的所有列? -

for i in range(1, N): 
    c_name = 'c%d' % i 
    dummy = DBSession().query(Dummy).filter_by(???=0).first() 

谢谢。

回答

3

您可以遍历表中的列。首先,表:

from sqlalchemy.orm.attributes import manager_of_class 
dummy_table = manager_of_class(Dummy).mapper.mapped_table 

最后,查询

for col in dummy_table.columns: 
    dummy = session.query(Dummy).filter(col == 0).first() 

或者,也许,你实际上是从一个更复杂的功能比你展示生成一组特定的列。在这种情况下,请使用getattr。不完全是。

for i in range(1, N): 
    c_name = 'c%d' % i 
    dummy = DBSession().query(Dummy).filter(getattr(Dummy, c_name) == 0).first() 
+0

拥有此模式表明您可能没有足够的列。更好地增加一些。严肃地说,这个反模式表明你应该考虑把列表分解成一个新的表格,外键返回到'Dummy'表格,列值和可能的索引,以保持项目的顺序。这也将使查询更容易。 – SingleNegationElimination

+0

谢谢先生,我严重低估了SQLAlchemy的灵活性,应该自己测试getattr。至于db设计,我们只是说在某些情况下这种类似NoSQL的效率可能是合理的。 – Jerry

+0

嗯,我不知道这一点,与只有一个索引的内部连接相比,带有N个查询的N个索引可以减慢速度。即使读取大量访问模式,当你向数据库提出正确的问题时也能很好地工作 – SingleNegationElimination