2016-08-25 39 views
1

我需要使用動態列及其值來動態生成/構建sqlalchemy查詢。在sqlalchemy python中構建動態過濾器

示例 - 我在SQL中有一個名爲「Convo」的表,它有像UserID,ConvoID,ContactID這樣的列。

我需要根據以下標準獲取行。

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

我已經對此使用了「烘焙查詢」邏輯。但有些我如何不能成功運行此查詢。

以下是我的代碼。

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' 

請幫我這個

+0

你可能想'getattr(tablename,key1)'而不是'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

如果您在使用動態密鑰和 「簡單」 平等檢查時,filter_by方法可能會更方便,因爲它使用與您的屬性名稱匹配的關鍵字參數並將其組裝到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需要多張關鍵字參數,你也許可以簡化您的查詢建設一個filter_by調用:

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

上述所有顯然都假設您的condition變量引用了字典。