2016-08-25 4 views
1

動的な列とその値を使用して動的にsqlalchemyクエリを生成/構築する必要があります。sqlalchemyの動的フィルタを構築するPython

例 - 私はSQLで "Convo"と呼ばれるテーブルを持っていますが、それには - UserID、ConvoID、ContactIDのような列があります。

私は、以下の基準に基づいて行を取得する必要があります。

criteria = (('UserID', 2), ('ConvoID', 1) ,('ContactID', 353)) 

私はこのために「Baked query」ロジックを使用しました。しかし、どのように私はこのクエリを正常に実行することができません。

以下はmyコードです。

criteria = (('UserID', 2), ('ConvoID', 1) ,('ContactID', 353)) 
baked_query = bakery(lambda session: session.query(tablename)) 
for key1 in condition: 
    baked_query += lambda q: q.filter(tablename.key1 == condition[key1]) 
    result = baked_query(self.session).all() 

私はエラーを取得しています -

AttributeError: type object 'Convo' has no attribute 'key1' 

あなたはダイナミックキーと "シンプル" の平等をチェックし、filter_by方法を使用している場合、この

+0

おそらく、 'tablename.key1'ではなく' getattr(tablename、key1) 'が必要です。 – univerio

答えて

2
criteria = (('UserID', 2), ('ConvoID', 1) ,('ContactID', 353)) 

query = session.query(tablename) 
for _filter, value in criteria: 
    query = query.filter(getattr(tablename, _filter) == value) 
result = query.all() 
+0

ありがとうございました:) – Poonam

2

で私を助けてください。プロパティ名に合ったキーワード引数を取り、それをwhere節にアセンブルするので、より便利かもしれません。

だからあなたの反復クエリの構築はそのようになります。

baked_query = bakery(lambda session: session.query(tablename)) 
for key, value in condition.items(): 
    baked_query += lambda q: q.filter_by(key=value) 

プラス、filter_byはmulitpleキーワード引数がかかるため、あなたはおそらく、単一filter_by呼び出しにクエリの構成を簡略化することができます

baked_query = bakery(lambda session: session.query(tablename)) 
baked_query += lambda q: q.filter_by(**condition) 

あなたのcondition変数が辞書を参照していることを前提としています。

関連する問題