欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

flask-sqlalchemy不确定有哪些条件时应该如何查询

程序员文章站 2022-03-11 18:40:59
...

1、问题引出

在做开发项目时肯定会遇到搜索的时候,平常简单的搜索可以是输入关键字后直接去数据库查询,但是当遇到你你不缺点有哪些字段是前端会传过来的时候如何查询呢?

2、如何进行不确定条件查询

先看一下我是如何来写进行不确定查询的

@app.route('/v1/task/auditing/viewlist/search', methods=['GET'])
@api_validator(schema={
    "search": {"type": "string", "required": False},
    "task_type": {"type": "string", "required": False},
    "execution": {"type": "string", "required": False},
    "create_time": {"type": "string", "required": False},
    "task_status": {"type": "string", "required": False}
})
def auditing_tasks_search(search, task_type, execution, create_time, task_status):
    search_dic = {"task_type": task_type, "execution": execution, "create_time": create_time,
                  "task_status": task_status}
    filters = []
    filters.append(Task.auditing_status == 0)
    for key, value in search_dic.items():
        if value:
            filters.append(getattr(Task, key) == value)
    if search:
        filters.append(Task.task_name.like("%{}%".format(search)))
    task = Task.query.filter(*filters).all()
    result = []
    for item in task:
        dic = {
            "task_name": item.task_name,
            "task_type": item.task_type,
            "create_time": item.create_time,
            "create_by": item.create_by,
            "execution": item.execution
        }
        result.append(dic)
    return response_success(data=result)

这是写的一个接口 不确定会前端传哪些要查询的条件按普通逻辑就会去一一判断这样即繁琐且代码臃肿其实的就可以将需要查询的条件加入到一个列表中比如:getattr(Task, key) == value ,利用很少的判断就可以将前端传过来的参数进行验证然后去查询: task = Task.query.filter(*filters).all() 结果就出来了

说明:

getattr(Task, key) == value

利用反射直接去类模型里哪相应的字段了,不需要写多个判断,假如不用反射代码应该是这样的

  if task_type :
        filters.append(Task.task_type == task_type )
        下面以此类推

这样也是简化代码的一种方式

task = Task.query.filter(*filters).all()

可以理解为把之前添加到filters列表里的条件放进去查询

参考博客

https://www.jianshu.com/p/a33f48387efa