如何在Flask SQLAlchemy中编写多条件复杂select查询语句?
SQLAlchemy 多条件查询与动态拼接实现
你当前使用的是Flask-SQLAlchemy的ORM查询语法,原生支持各类逻辑运算条件,也完全支持通过分支判断动态拼接条件,具体实现方式如下:
基础逻辑运算符用法
首先纠正下你示例代码的小问题:filter()方法接收模型字段的比较表达式作为位置参数,你写的关键字参数传参是filter_by()的用法,标准单条件写法应该是User.query.filter(User.username == current_user.username).first()。
各类常用逻辑运算符的实现方式:
- 与(AND):直接在
filter()中传入多个条件即可,默认多个条件为AND关系;也可以显式导入and_函数包裹条件 - 或(OR):需要导入
or_函数,将需要取或关系的条件作为参数传入 - 不等于/大小比较/模糊匹配:直接使用Python原生运算符即可,比如
!=、>、<、like()、in_()都支持
基础多条件查询示例:
from sqlalchemy import and_, or_ # 查询:用户名为当前用户 且 状态不是已删除,或者用户为管理员的账号 user_list = User.query.filter( or_( and_( User.username == current_user.username, User.status != "deleted" ), User.is_admin == True ) ).all()
动态拼接查询条件
完全可以通过if分支逐段追加查询条件,这也是复杂查询场景下非常推荐的写法,可读性和可维护性远高于把所有条件堆在同一个filter里。
实现逻辑很简单:先初始化基础查询对象,再根据判断逐次给查询对象追加filter条件,所有条件拼接完成后再执行查询触发数据库请求:
# 初始化基础查询,不带任何过滤条件 query = User.query # 按业务逻辑逐段追加AND条件 if current_user: query = query.filter(User.username == current_user.username) if exclude_deleted: query = query.filter(User.status != "deleted") # 如果需要动态拼接OR条件,可以先把条件存到列表里 or_conditions = [] if include_admin: or_conditions.append(User.is_admin == True) if include_self: or_conditions.append(User.id == current_user.id) # 列表非空时,解包传入or_追加到查询 if or_conditions: query = query.filter(or_(*or_conditions)) # 所有条件拼接完成后执行查询 result = query.first()
内容的提问来源于stack exchange,提问作者Tamir Polyakov
相关产品推荐
相关产品推荐

