0

0

Python tortoise-orm 的生产迁移经验

冰川箭仙

冰川箭仙

发布时间:2026-02-19 05:25:35

|

202人浏览过

|

来源于php中文网

原创

必须统一使用tortoise orm迁移流程:改模型→tortoise-orm generate -a→tortoise-orm upgrade;混用alembic会导致迁移失效、表结构不更新。

python tortoise-orm 的生产迁移经验

迁移命令执行后表没变,alembictortoise 混用了?

不是所有迁移工具能混用。Tortoise ORM 自带 generate_schemaupgrade_models,但不兼容 alembic 的迁移历史追踪机制——它压根不读 alembic_version 表,也不写 migration 文件。一旦你用 alembic revision --autogenerate 生成过文件,再切回 tortoise,就容易出现“执行了 migrate 却没建表/改字段”的假象。

实操建议:

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

  • 生产环境必须统一用 tortoise 自己的迁移流程:先改 models.py,再跑 tortoise-orm generate -a(生成迁移脚本),最后 tortoise-orm upgrade
  • 已有 alembic 历史?别硬切。要么导出当前 DB 结构重置为 Tortoise 初始状态,要么停用 tortoise 迁移、全程交给 alembic 管理(需手动补全模型与迁移的映射)
  • tortoise-orm generate 默认只对比 TORTOISE_ORM 配置里的 apps,漏配会导致跳过某些模型——检查 config.py"models" 路径是否拼错、模块是否被 import 过

upgrade 报错 duplicate columncannot alter type of a column used by a view

这是 PostgreSQL 最常踩的坑:Tortoise 的自动迁移对视图、函数依赖、约束名不敏感,生成的 SQL 可能直接 ALTER COLUMN TYPE,而 PG 在列被视图引用时会拒绝执行。

实操建议:

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

  • 升级前手动查一遍:SELECT * FROM pg_views WHERE definition LIKE '%your_column_name%';,有结果就得先删视图,迁移完再重建
  • 字段类型变更(比如 CharFieldTextField)尽量分两步:先加新字段,用代码双写过渡,再删旧字段——避免单次迁移里同时 ADD COLUMN + DROP COLUMN 导致事务卡住
  • 如果迁移脚本里出现 ALTER TABLE ... RENAME COLUMN,确认目标列名在 DB 里确实存在;Tortoise 有时会把字段名大小写搞错(尤其用了 db_column 参数时),导致误判为新增列

生产环境不敢直接 upgrade,怎么安全灰度?

没有内置的“dry-run”模式,tortoise-orm upgrade --dry-run 只打印 SQL,但不校验实际执行可行性(比如索引名冲突、外键环)。真要灰度,得靠人工拆解和 DB 层控制。

凡科AI抠图
凡科AI抠图

简单好用的在线抠图工具

下载

实操建议:

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

  • 每次 generate 后,打开生成的 migrations/xxx.py,重点看 upgrade 函数里的 await connection.execute_script(...) 内容——它可能是一整段 SQL 字符串,而不是原子化操作
  • 把脚本里的 SQL 复制出来,在测试库上用 BEGIN; ... ; ROLLBACK; 包一层执行,观察锁表现和执行时间
  • 涉及数据迁移(比如 update_queryset)的步骤,务必单独抽成管理命令(python manage.py migrate_user_status),不在自动迁移里做复杂逻辑
  • 加个 pre_upgrade 钩子:在迁移前自动备份关键表(pg_dump -t users > users_pre_migrate.sql),别依赖 Tortoise 的快照机制——它不存数据

generate 不识别模型变更,或反复生成同一行 ADD COLUMN

根本原因通常是模型定义和数据库实际结构“感知不同频”:Tortoise 读的是当前 Python 模型,但比对依据是它自己缓存的 _meta.db_schema(来自上次 generate_schemainit_models),不是实时查 DB。

实操建议:

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

  • 改模型后,删掉 migrations/__pycache__.tortoise 缓存目录(如果有),再跑 generate——否则它可能基于旧 schema 认为“这列早就该有了”
  • 字段加了 null=True 但 DB 里对应列是 NOT NULL?Tortoise 不会自动补 DEFAULTUSING 子句,得手动编辑迁移脚本,在 ADD COLUMN 后加 ALTER COLUMN ... SET DEFAULT ...
  • db_column="user_id" 定义字段,但模型里写的是 user: fields.ForeignKeyRelation["User"]?Tortoise 可能误判外键字段名,导致迁移脚本漏掉约束——此时应显式指定 related_nameon_delete,减少推断

事情说清了就结束。最麻烦的永远不是语法,而是 Tortoise 把“模型→DB”当单向翻译,却没暴露足够多的中间态供你校验——所以每一步都得自己查 schema、看生成 SQL、盯住 pg_stat_activity。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

985

2023.10.12

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

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

334

2023.10.27

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

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

377

2024.02.23

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

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

1718

2024.03.06

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

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

374

2024.03.06

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

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

1292

2024.04.07

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

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

585

2024.04.29

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

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

436

2024.04.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号