2011-09-05 8 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