python flask sqlalchemy 多字段查询,动态改变查询语句

突然有个想法,如果做查询的时候,字段变化复杂,你也不能写死查询语句,就像这样
A.query.filter(name=='ds') 是写死的。 如果我需要动态切换查询字段,尤其是在多字段的时候,想法是能有一个函数做为查询条件,这样我控制函数的输出就行了,类似 A.query.filter(fun()) 此时 fun 返回 'age==18',
如果我需要查name,或者查更多的字段,改变func的输出就行了。

我知道不能直接给函数,通常是写查询语句,这样查询被固定了,不够灵活。
不知道我的想法能否被实现(有一种方案就是使用eveal()包裹整个查询语句,然后修改filter过滤参数),还有没有更好的实现方法呢?

阅读 5.8k
1 个回答

我一般是封装成一个多参数的函数, 如果参数为空字符串或者为-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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏