2017-05-11 99 views
0

一個簡單的查詢看起來像這樣是否有使用Sqlalchemy的Flask動態查詢生成器?

User.query.filter(User.name == 'admin') 

在我的代碼,我需要檢查正在傳遞的參數,然後將結果從基於參數數據庫進行篩選。

例如,如果用戶表包含諸如用戶名,位置和電子郵件之類的列,則請求參數可以包含其中之一或可以包含列的組合。我不想像下面顯示的那樣檢查每個參數並鏈接過濾器,而是創建一個可以傳遞給一個過濾器並可以返回結果的動態查詢字符串。我想創建一個單獨的函數來評估所有參數並生成一個查詢字符串。一旦生成查詢字符串,我可以傳遞該查詢字符串對象並獲得所需的結果。我想避免使用RAW SQL查詢,因爲它違背了使用ORM的目的。

if location: 
    User.query.filter(User.name == 'admin', User.location == location) 
elif email: 
    User.query.filter(User.email == email) 

回答

1

您可以申請filter反覆查詢:

query = User.query 

if location: 
    query = query.filter(User.location == location) 

if email: 
    query = query.filter(User.email == email) 

如果你只需要精確匹配,這裏還有filter_by

criteria = {} 

# If you already have a dict, there are easier ways to get a subset of its keys 
if location: criteria['location'] = location 
if email: criteria['email'] = email 

query = User.query.filter_by(**criteria) 

如果你不喜歡那些對一些原因,我能提供的最好的是:

from sqlalchemy.sql.expression import and_ 


def get_query(table, lookups, form_data): 
    conditions = [ 
     getattr(table, field_name) == form_data[field_name] 
     for field_name in lookups if form_data[field_name] 
    ] 

    return table.query.filter(and_(*conditions)) 


get_query(User, ['location', 'email', ...], form_data) 
+0

這就是我想要避免的,有很多列我需要做過濾器包括列的組合。想象一下,我需要使用多少個ifs。 –

+0

@ShwetabhSharan:你能舉一個例子說明「列的組合」是一個問題嗎?除非要將用戶輸入直接傳遞給SQLAlchemy函數(壞主意),否則至少要避免*列出所有可能的查找鍵,注意不可能。 – Ryan

+0

給你舉個例子, 查詢= User.query 如果位置: 查詢= query.filter(User.location ==位置) 如果電子郵件: 查詢= query.filter(User.email ==電子郵件) 如果位置和電子郵件: 查詢= query.filter(User.email ==電子郵件,User.location ==位置) 如果用戶名和位置: 查詢= query.filter(User.username ==用戶名,User.location == location) etc –

相關問題