【Python系列】空值判断

csdn

博客目录

    • 初始代码分析
    • 优化点一:查询条件的整合
    • 优化点二:使用 SQLAlchemy 推荐语法
    • 优化点三:简化条件判断
    • 优化点四:错误消息的规范化
    • 更现代的 SQLAlchemy 2.0 风格

在软件开发中,数据库查询是最常见的操作之一,但如何编写高效、可读且健壮的查询代码却是一门艺术。

初始代码分析

原始代码片段如下:

app = db.session.query(App).filter(App.id == workflow_provider.app_id).first()

if app is None or app.workflow_id is None:
    raise ToolProviderNotFoundError(f"workflow provider {provider_id} not found")

这段代码的功能是查询一个 App 记录,并检查该记录是否存在以及其 workflow_id 是否为空。虽然功能正确,但从多个方面来看都有优化空间。

优化点一:查询条件的整合

第一个优化点是将workflow_id is None的判断从 Python 代码移到 SQL 查询中:

app = (
    db.session.query(App)
    .filter(
        App.id == workflow_provider.app_id,
        App.workflow_id.isnot(None)
    )
    .first()
)

为什么这样更好?

  1. 数据库层面过滤:在数据库层面就过滤掉不符合条件的记录,减少了不必要的数据传输。数据库引擎优化了查询执行,通常比在应用层过滤更高效。

  2. 减少 Python 处理:避免了在 Python 中处理不符合条件的记录,减少了内存使用和 CPU 时间。

  3. 原子性操作:查询条件更加完整地表达了业务逻辑,使代码意图更清晰。

优化点二:使用 SQLAlchemy 推荐语法

在 SQLAlchemy 中,isnot(None)是推荐的写法,而不是 Python 中的is not None

App.workflow_id.isnot(None)  # 优于 App.workflow_id is not None

这是因为:

  • SQLAlchemy 重载了这些操作符以生成正确的 SQL 语法
  • 保持一致性,所有查询条件都使用 SQLAlchemy 的方法
  • 在某些复杂查询中,Python 的操作符可能无法正确转换为 SQL

优化点三:简化条件判断

原始代码使用了if app is None or app.workflow_id is None,而优化后可以简化为:

if not app:
    raise ToolProviderNotFoundError(f"Workflow provider {provider_id} not found")

这种简化基于以下考虑:

  • 查询已经确保了返回的 app 要么是 None,要么有 workflow_id
  • if not app在 Python 中与if app is None对于查询结果判断是等价的
  • 减少了条件分支,使代码更简洁

优化点四:错误消息的规范化

将错误消息中的"workflow"改为首字母大写:

f"Workflow provider {provider_id} not found"

虽然是小改动,但体现了:

  • 专业性和一致性
  • 更好的可读性
  • 符合错误消息的一般格式规范

更现代的 SQLAlchemy 2.0 风格

进一步优化可以使用 SQLAlchemy 2.0 风格的查询:

from sqlalchemy import select

app = db.session.execute(
    select(App).where(
        App.id == workflow_provider.app_id,
        App.workflow_id.isnot(None)
    )
).scalar_one_or_none()

【Python系列】空值判断_第1张图片

这种写法的优势包括:

  1. 更清晰的 API 设计select()where()方法分离,语义更明确
  2. 统一查询接口:所有查询都使用execute()方法
  3. 结果处理明确scalar_one_or_none()明确表达了期望单个结果或 None
  4. 面向未来:SQLAlchemy 2.0 是未来的方向,新项目推荐使用

觉得有用的话点个赞 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!

如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!

Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!

img

你可能感兴趣的:(【Python系列】空值判断)