鍍金池/ 問(wèn)答/Python  數(shù)據(jù)庫(kù)/ python flask sqlalchemy 多字段查詢,動(dòng)態(tài)改變查詢語(yǔ)句

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

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

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

回答
編輯回答
吢涼

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

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