
在使用 SQLAlchemy 进行数据库操作时有时我们希望根据某些条件来执行查询但如果这些条件为空我们希望跳过这些条件即不将这些条件加入到查询语句中。这在很多情况下是有用的特别是在构建动态查询时。下面介绍几种实现这一需求的方法。方法 1使用filter()和and_()你可以使用filter()方法配合sqlalchemy.sql.expression.and_()来构建查询并通过检查条件是否为空来决定是否将它们加入到查询中。from sqlalchemy import create_engine, Column, Integer, String, func, and_ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base declarative_base() class MyModel(Base): __tablename__ my_table id Column(Integer, primary_keyTrue) name Column(String) age Column(Integer) # 创建引擎和会话 engine create_engine(sqlite:///mydatabase.db) Session sessionmaker(bindengine) session Session() # 假设我们有一些可能为空的查询条件 name_filter Alice # 可能为空或非空 age_filter None # 可能为空或非空 # 构建查询 conditions [] if name_filter: conditions.append(MyModel.name name_filter) if age_filter is not None: conditions.append(MyModel.age age_filter) query session.query(MyModel).filter(*conditions) results query.all() print(results)方法 2使用filter()和条件表达式三元运算符你也可以在filter()中直接使用三元运算符来决定是否添加条件。query session.query(MyModel).filter( (MyModel.name name_filter) if name_filter else func.True(), # 如果 name_filter 非空则添加条件否则始终为真相当于不添加此条件 (MyModel.age age_filter) if age_filter is not None else func.True() # 同理如果 age_filter 非空则添加条件否则始终为真 ) results query.all() print(results)方法 3使用filter()和None检查更简洁如果你使用的是 SQLAlchemy 1.4 或更新版本可以利用更简洁的语法直接在filter()中检查None。query session.query(MyModel).filter( MyModel.name name_filter if name_filter is not None else None, # 如果 name_filter 非空则添加条件否则不添加任何条件相当于跳过 MyModel.age age_filter if age_filter is not None else None # 同理如果 age_filter 非空则添加条件否则不添加任何条件相当于跳过 ) results query.all() print(results)以上方法都可以实现根据条件是否为空来决定是否将它们加入到查询中的需求。选择适合你代码风格和SQLAlchemy版本的方法即可。