Flask-SQLAlchemy 3.0正确查询方式及框架选择疑问
SQLAlchemy 2.0中,Query.get()方法已被标记为遗留方法,现在有多种替代写法可实现按主键获取User对象(以下代码均在with app.app_context()块中运行),下面逐一分析各方式的适用场景及优劣:
五种查询方式对比
方式1(旧实现):
user = User.query.get(1)
这是Flask-SQLAlchemy的遗留Query接口写法,虽然当前仍能运行,但官方明确不推荐在新代码中使用,后续版本存在被移除的风险,且与SQLAlchemy 2.0的新API风格不统一。方式2:
user = db.session.get(User, 1)
这是SQLAlchemy 2.0原生的主键查询方法,专门用于按主键获取对象,会优先查询会话缓存,性能高效,语法简洁直观,是替代Query.get()的最佳选择之一,适合仅需按主键查询的场景。方式3:
user = db.session.scalars(db.select(User).filter_by(id=1)).first()
基于SQLAlchemy 2.0的select API实现,scalars()直接返回标量结果集,first()取第一条数据。写法比方式4更简洁,扩展性强,适合需要构建复杂查询(如多条件过滤、关联查询)的场景,但仅用于主键查询时略显冗余。方式4:
user = db.session.execute(db.select(User).filter_by(id=1)).scalars().first()
Flask-SQLAlchemy文档推荐的通用查询写法,execute()返回完整结果集后,再通过scalars()转换为标量并取第一条。本质与方式3一致,是SQLAlchemy 2.0的标准查询流程,适合所有复杂查询场景,但语法确实比get()繁琐。方式5:
user = db.get_or_404(User, 1)
Flask-SQLAlchemy提供的Web场景快捷方法,若查询不到对象会直接返回404响应,无需手动处理对象不存在的逻辑,极大简化Web开发中的异常处理,非常适合需要快速返回404的接口场景。
是否继续使用Flask-SQLAlchemy?
建议继续使用Flask-SQLAlchemy,原因如下:
- 它与Flask深度集成,自动管理请求生命周期内的会话,无需手动处理会话的创建、提交和关闭;
- 提供了
get_or_404、paginate等Web开发专属的快捷工具,减少重复代码; - 完美兼容SQLAlchemy 2.0的新API,同时保留了部分便捷的封装,平衡了原生API的灵活性和开发效率。
若仅开发简单脚本,基础SQLAlchemy足够,但对于Flask Web应用,Flask-SQLAlchemy能显著提升开发效率和代码可维护性。
内容的提问来源于stack exchange,提问作者Josef Lát

