鍍金池/ 問答/Python  數(shù)據(jù)庫/ python flask sqlalchemy 多字段查詢,動態(tài)改變查詢語句

python flask sqlalchemy 多字段查詢,動態(tài)改變查詢語句

突然有個想法,如果做查詢的時候,字段變化復(fù)雜,你也不能寫死查詢語句,就像這樣
A.query.filter(name=='ds') 是寫死的。 如果我需要動態(tài)切換查詢字段,尤其是在多字段的時候,想法是能有一個函數(shù)做為查詢條件,這樣我控制函數(shù)的輸出就行了,類似 A.query.filter(fun()) 此時 fun 返回 'age==18',
如果我需要查name,或者查更多的字段,改變func的輸出就行了。

我知道不能直接給函數(shù),通常是寫查詢語句,這樣查詢被固定了,不夠靈活。
不知道我的想法能否被實現(xiàn)(有一種方案就是使用eveal()包裹整個查詢語句,然后修改filter過濾參數(shù)),還有沒有更好的實現(xiàn)方法呢?

回答
編輯回答
吢涼

我一般是封裝成一個多參數(shù)的函數(shù), 如果參數(shù)為空字符串或者為-1就表示沒有此查詢條件

from sqlalchemy.sql import and_, or_
# 多條件查詢
def get_safety_list(offset, limit, con_date1, con_date2, con_invite, con_name, con_plan, salesman, con_pay):
    try:
        condition = (Safety.id > 0)

        if con_date1 > 0:
            condition = and_(condition, Safety.date >= con_date1)
            condition = and_(condition, Safety.date <= con_date2)

        if con_invite != "":
            condition = and_(condition, Safety.invite.ilike('%' + con_invite + '%'))
        if con_name != "":
            condition = and_(condition,
                             or_(Safety.name.ilike('%' + con_name + '%'), Safety.phone.ilike('%' + con_name + '%')))
        if con_plan != -1:
            condition = and_(condition, Safety.safety_plan == con_plan)

        if len(salesman) > 0:
            condition = and_(condition, Safety.invite.in_(salesman))

        if con_pay != -1:
            condition = and_(condition, Safety.origin == con_pay)

        a = Safety.query.filter(condition)
        count = a.count()
        a = a.order_by(Safety.id.desc()).limit(limit).offset(offset).all()
        return a, count
    except Exception as e:
        logging.error("manager.dbhelper.py get_safety_list exception:" + str(e))
    return (), 0
2018年2月2日 07:10