推荐 register_tortoise 是因为它自动处理启动初始化、关闭连接、异常映射(如 404)、自动建表(generate_schemas=true),避免手动 init 导致的连接泄漏或错误码不一致。

直接用 register_tortoise 最省事,别自己写 init_db ——除非你明确需要控制连接生命周期或做多库路由。
为什么推荐 register_tortoise 而不是手动 init
FastAPI 官方生态里,tortoise-orm 提供了 tortoise.contrib.fastapi.register_tortoise 这个封装函数,它自动处理了:startup 时初始化、shutdown 时关闭连接、异常中间件注册(比如把 Tortoise.exceptions.DoesNotExist 映射成 404)、甚至支持 generate_schemas=True 自动建表。自己手写 await Tortoise.init() 容易漏掉 close_connections 或没加异常处理器,导致连接泄漏或错误码不一致。
常见错误现象:
- 服务重启后首次请求慢 → 没开
generate_schemas=True,每次查表都触发元数据检查 - 压测时出现
asyncpg.exceptions.TooManyConnectionsError→ 忘记在shutdown里调用Tortoise.close_connections() - 查不到记录却返回 500 而非 404 → 没启用
add_exception_handlers=True
register_tortoise 的关键参数怎么填
PostgreSQL 连接字符串格式必须是 postgres://user:password@host:port/dbname(注意不是 postgresql://,Tortoise 默认不认后者,会静默 fallback 到 SQLite)。
实操建议:
-
db_url建议从环境变量读取,比如os.getenv("DATABASE_URL"),避免硬编码 -
modules必须是 Python 模块路径列表,例如{"models": ["app.models"]},路径错一个字母就找不到模型,不会报错,只会建空库 -
generate_schemas=True仅用于开发/测试;生产环境务必关掉,改用aerich做迁移 - 如果用 Pydantic
BaseSettings管理配置,记得字段名匹配:PostgreSQL 连接串中user对应数据库用户名,不是系统用户
PostgreSQL 驱动装哪个?asyncpg 还是 psycopg2
必须装 asyncpg,psycopg2 是同步驱动,和 Tortoise 的异步设计不兼容——哪怕装了也完全不生效,启动时无提示,但所有数据库操作都会卡死或超时。
安装命令要带 extra:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
pip install tortoise-orm[asyncpg]
不是 pip install asyncpg 单独装(虽然也能跑,但缺了 Tortoise 内部的适配层,某些高级功能如 JSON 字段操作可能异常)。
容易踩的坑:
- 误装
psycopg2-binary→ FastAPI 启动不报错,但发请求时卡在await User.all(),日志里看不到任何数据库交互 - Docker 部署时只写了
asyncpg在requirements.txt,却忘了tortoise-orm本身没写,导致ModuleNotFoundError: No module named 'tortoise' - 本地开发用 SQLite,CI 用 PostgreSQL,结果
db_url没区分环境,测试跑不过
模型定义后,第一次运行不建表?
两个必要条件缺一不可:
-
register_tortoise(..., generate_schemas=True)开启 - 模型类必须继承
tortoise.models.Model,且文件被modules参数成功导入(比如app/models/__init__.py里显式from .user import User)
典型失败场景:
模型文件叫 user_model.py,但 modules={"models": ["app.models"]} 只扫描 app/models/__init__.py,没 import 这个文件 → 启动日志里有 No models registered,但不会中断进程。
验证是否生效:启动后访问 /docs,然后执行一条简单查询(如 curl http://localhost:8000/users),看 PostgreSQL 日志是否有 CREATE TABLE 记录,或者直接连进数据库执行 \dt。
复杂点在于:Tortoise 的 schema 生成是「懒加载」的,只有第一个 ORM 操作触发时才建表。所以光启动服务不发请求,表不会出现——这点和 Django migrate 主动建表完全不同,容易误判配置失败。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










