sqlalchemy 原生sql判断条件是否为空,为空则跳过

在使用 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_key=True) 
    name = Column(String) 
    age = Column(Integer) 

# 创建引擎和会话 
engine = create_engine('sqlite:///mydatabase.db') 
Session = sessionmaker(bind=engine) 
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版本的方法即可。

相关推荐
OnlineProxy3 小时前
移动应用数据爬取:通过模拟器与流量嗅探对 API 进行逆向工程
爬虫·python·httpx
染指11103 小时前
162.Agent-LangGraph-检查点的作用
人工智能·python·langchain·agents
飞浪纪元[FWC–FE]3 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt
Wang's Blog3 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我123453 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
架构师伯子明3 小时前
FFmpeg C++学习(一):编译和demo
开发语言·c++·学习
海域云SeaArea_3 小时前
Windows Server 2008 R2 从零安装 IIS7.5(二):php.ini 配置
开发语言·windows·php
叼烟扛炮3 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
xixingzhe23 小时前
图表中同比与环比的区别:看趋势还是看变化?
开发语言·python
andyweike4 小时前
Swift
开发语言·ios·swift