Flask-SQLAlchemy中User.query.get(1)的SQLAlchemy2.0兼容替代方案及疑问
Flask-SQLAlchemy 3.x 兼容SQLAlchemy 2.0的
get()替代方案解析 问题背景
SQLAlchemy 2.0已弃用Query.get()方法,Flask-SQLAlchemy的旧版查询接口(如Model.query)也被标记为过时。在项目中执行User.query.get(1)会触发旧版API警告。
核心疑问
Flask-SQLAlchemy中User.query.get(1)的SQLAlchemy 2.0兼容替代写法是什么?为何Flask-SQLAlchemy官方文档推荐方案2,而方案1才是SQLAlchemy 2.0迁移指南中给出的标准新版本写法?
两种替代方案
方案1:db.session.get(User, 1)
该写法出自SQLAlchemy官方2.0迁移指南,可在项目中正常运行,但仅在Flask-SQLAlchemy 3.0.x文档的get_or_404 API参考中有简要提及。
方案2:db.session.execute(db.select(User).filter_by(id=1)).scalar()
该写法来自Flask-SQLAlchemy官方文档,作为旧版Model.query和session.query的通用替代方案,同样能正常执行。
方案对比
- 方案1与旧版
User.query.get(1)行为高度一致:首次执行会将结果缓存到session中,后续调用不会重复发起数据库查询 - 方案2每次执行都会直接访问数据库,不利用session的缓存机制
环境配置
- 版本:Python 3.11虚拟环境,使用Flask 2.2.2、Flask-SQLAlchemy 3.0.3、SQLAlchemy 2.0.1
- 项目结构:遵循Flask Mega-Tutorial第四部分(数据库)的设计
内容的提问来源于stack exchange,提问作者Patrick Cantwell
相关产品推荐
相关产品推荐

