讲师中心 微信公众号
AI工具推荐 视频效率加速

Python tortoise-orm vs gino vs sqlalchemy async 的选型

胖瑶小哥_5977

胖瑶小哥_5977

发布时间:2026-02-21 18:19:02

|

693人浏览过

|

来源于php中文网

原创

SQLAlchemy 2.0+ 的 AsyncSession 是生产可用的异步 ORM 方案,需配合 AsyncEngine 和异步驱动;Tortoise 适合快速原型但迁移与聚合查询易出错;Gino 已停更,不建议新项目使用。

python tortoise-orm vs gino vs sqlalchemy async 的选型

SQLAlchemy async 是生产可用的,但得用 2.0+ 和 AsyncSession

很多人试了 SQLAlchemy 1.x 的 async 尝试(比如用 await 调 session.query()),结果报 RuntimeError: This event loop is already running 或直接同步阻塞——因为 1.x 根本没真正的异步 ORM 层。SQLAlchemy 2.0+ 才通过 AsyncSession + create_async_engine() 提供完整异步支持,底层依赖 asyncpg(PostgreSQL)或 aiomysql(MySQL)等异步驱动。

实操建议:

  • 必须用 sqlalchemy>=2.0.0,且显式创建 AsyncEngine 和 AsyncSession,不能混用同步 Session
  • select() 构建查询后,必须用 session.execute() + await result.scalars().all(),不是 .all() 直接调
  • 关系加载要主动用 selectinload() 或 joinedload(),lazy='select' 在 async 下会触发隐式同步查询,容易卡住
  • 事务必须用 async with session.begin():,裸 session.commit() 会报错

Tortoise ORM 适合快速原型,但字段定义和迁移逻辑容易反直觉

它语法像 Django ORM,写起来快,class User(Model): name = fields.CharField(max_length=50) 这种声明很顺手。但它不是基于 SQLAlchemy 的抽象层,而是自己实现的查询生成器 + 异步驱动封装,导致一些行为偏离预期。

常见踩坑点:

立即学习“Python免费学习笔记(深入)”;

python学习
python学习

Python 编程学习助手 skill,面向零基础用户。 当用户表达以下意图时触发: - 学习 Python 基础概念(变量、数据类型、循环、函数、类等) - 请求 Python 练习题或测验 - 请求审查或调试 Python 代码 - 请求 Python 项目实战指导(爬虫、数据分析、Web 开发等入门项目) - 泛化表述如"教我 Python""我想学编程""Python 怎么写""帮我学 Python" 此 skill

下载
  • fields.ForeignKeyField('models.User', 'user') 这种字符串引用写法,在 PyCharm 里没法跳转,重构时极易断链
  • 迁移命令 tortoise-cli aerich init-db 生成的迁移文件不带 SQL DDL,实际执行靠运行时解析模型 diff,出问题难排查
  • 聚合查询(如 await User.all().annotate(total=Count('id')))在 PostgreSQL 上生成的 SQL 可能漏 GROUP BY,需要手动加 .group_by('id')
  • 不支持原生 JSONB 操作符(如 @>),得用 raw_sql 绕过

Gino 已停止维护,新项目别碰

gino 最后一次发布是 2021 年 11 月(v1.0.1),GitHub 仓库标了 Deprecated,作者明确建议迁移到 SQLAlchemy 2.0。它曾以轻量、无模型类、纯异步著称,但代价是缺失很多 ORM 基础能力:没有关系预加载、没有完整的迁移系统、没有类型安全的查询构造器。

如果你在老项目里看到它,要注意:

  • db.bind 是全局引擎实例,多租户场景下无法隔离连接池
  • model.select('name').where(...) 返回的是 CompiledQuery,不是可 await 对象,得再套一层 await db.all(query)
  • 和 alembic 集成麻烦,官方示例用的还是自研的 gino-migrate,现已无人维护

选型关键不在“谁更异步”,而在“你缺什么”

SQLAlchemy async 学习成本高,但类型提示全、调试信息准、生态工具链(Alembic、SQLModel、Pydantic 集成)成熟;Tortoise 开箱即用,但查文档常遇到“这个功能有,但没写进文档”或者“这个 bug 在 GitHub issue 里挂了两年”。Gino 现在只剩兼容性风险。

几个硬指标帮你判断:

  • 要用 Alembic 做版本化迁移 → 只能选 SQLAlchemy async
  • 团队熟悉 Django ORM,且不打算长期维护复杂查询 → Tortoise 更省力
  • 项目已用 Pydantic v2,且想共用模型定义 → SQLAlchemy + SQLModel 或 Tortoise(后者需手动桥接)
  • 需要细粒度控制连接池、超时、重试策略 → SQLAlchemy 的 AsyncEngine 参数最透明

真正容易被忽略的,是异步 ORM 对测试的影响:所有单元测试都得跑在 async event loop 里,pytest-asyncio 的 scope 设置不对,session 会复用或泄漏,mock 数据库行为比同步时代更难稳定还原。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4463

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

931

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1169

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6421

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3203

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6380

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8721

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1190

2024.04.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn