统一迁移脚本生成工具使用指南
概述
generate_migration.py 是一个统一生成 MySQL 和 SQLite 迁移脚本的工具,避免分别为每个数据库执行 alembic 命令。
快速开始
基本使用
# 为所有数据库自动生成迁移脚本
python generate_migration.py --autogenerate -m "feat add user status field"
# 为所有数据库手动创建迁移脚本
python generate_migration.py --manual -m "fix correct data type issue"
命令参数
必需参数
| 参数 | 说明 | 示例 |
|---|---|---|
-m, --message |
迁移描述信息 | -m "feat add user profile" |
可选参数
| 参数 | 说明 | 示例 |
|---|---|---|
--autogenerate |
自动生成(基于模型变化) | --autogenerate |
--manual |
手动创建空白脚本 | --manual |
-d, --database |
指定数据库(可多次使用) | -d mysql_agent -d sqlite_agent |
使用场景
场景1:自动生成(推荐)
用途:基于 SQLAlchemy 模型的变化自动生成迁移脚本
# 为所有4个数据库自动生成
python generate_migration.py --autogenerate -m "feat add user status field"
输出:
============================================================
开始生成迁移脚本: Add user status field
模式: 自动生成
数据库: ['MySQL Agent Database', 'MySQL Ops Database', 'SQLite Agent Database', 'SQLite Ops Database']
============================================================
✓ MySQL Agent Database: upgrade/mysql/alembic_agent/versions/add_user_status_field_xxxxx.py
✓ MySQL Ops Database: upgrade/mysql/alembic_ops/versions/add_user_status_field_xxxxx.py
✓ SQLite Agent Database: upgrade/sqlite/alembic_agent/versions/add_user_status_field_xxxxx.py
✓ SQLite Ops Database: upgrade/sqlite/alembic_ops/versions/add_user_status_field_xxxxx.py
场景2:手动创建
用途:创建空白的迁移脚本,手动编写迁移逻辑
# 为所有数据库创建空白脚本
python generate_migration.py --manual -m "feat custom data migration"
场景3:指定数据库
用途:只为特定的数据库生成迁移脚本
# 只为 MySQL Agent 数据库生成
python generate_migration.py --autogenerate -d mysql_agent -m "feat update agent schema"
# 为多个指定数据库生成
python generate_migration.py --autogenerate -d mysql_agent -d sqlite_agent -m "fix update schema"
对比传统方式
传统方式(繁琐)
# 需要分别为每个数据库执行命令
alembic -n alembic_mysql_agent revision --autogenerate -m "feat add user status"
alembic -n alembic_mysql_ops revision --autogenerate -m "feat add user status"
alembic -n alembic_sqlite_agent revision --autogenerate -m "feat add user status"
alembic -n alembic_sqlite_ops revision --autogenerate -m "feat add user status"
新方式(简洁)
# 一次命令完成所有数据库
python generate_migration.py --autogenerate -m "feat add user status"
工作原理
1. 多配置支持
工具利用 alembic.ini 中的多配置段:
[alembic_mysql_agent]
[alembic_mysql_ops]
[alembic_sqlite_agent]
[alembic_sqlite_ops]
2. 循环调用
工具循环为每个配置调用 alembic revision 命令:
for db in databases:
alembic -n {db['config']} revision -m {message}
3. 动态环境变量注入
关键特性:为每个数据库动态注入正确的 DB_TYPE 环境变量
# MySQL 配置
if "mysql" in config_name:
db_type = "mysql"
env["DB_TYPE"] = "mysql" # 动态注入
# SQLite 配置
if "sqlite" in config_name:
db_type = "sqlite"
env["DB_TYPE"] = "sqlite" # 动态注入
为什么需要动态注入:
-
模型代码的条件判断
# 模型代码中根据 DB_TYPE 决定字段类型 if settings.DB_TYPE.lower() == "sqlite": id = mapped_column(Integer, ...) else: id = mapped_column(BigInteger, ...) -
确保正确的数据库结构
- MySQL alembic 需要生成 MySQL 类型的迁移
- SQLite alembic 需要生成 SQLite 类型的迁移
-
避免混淆
.env文件中的DB_TYPE只能是一个值- 通过动态注入,每个数据库都能获得正确的
DB_TYPE
4. 结果收集
收集每个数据库的生成结果,统一展示摘要。
生成的文件
文件位置
迁移脚本会生成到相应的目录:
backend/
├── upgrade/
│ ├── mysql/
│ │ ├── alembic_agent/versions/
│ │ │ └── add_user_status_field_xxxxx.py # MySQL Agent
│ │ └── alembic_ops/versions/
│ │ └── add_user_status_field_xxxxx.py # MySQL Ops
│ └── sqlite/
│ ├── alembic_agent/versions/
│ │ └── add_user_status_field_xxxxx.py # SQLite Agent
│ └── alembic_ops/versions/
│ └── add_user_status_field_xxxxx.py # SQLite Ops
文件命名
所有文件使用统一的命名格式:
{description}_{revision_id}.py
例如:
feat_add_user_status_field_4b4dd5bb39b4.py
高级用法
1. 结合便捷脚本使用
# 1. 生成迁移脚本
python generate_migration.py --autogenerate -m "feat add user profile"
# 2. 执行迁移
./migrate.sh mysql agent upgrade
./migrate.sh mysql ops upgrade
./migrate.sh sqlite agent upgrade
./migrate.sh sqlite ops upgrade
2. 只为需要的数据库生成
# 只为 MySQL 数据库生成(SQLite 可能不需要这个变更)
python generate_migration.py --autogenerate -d mysql_agent -d mysql_ops -m "feat add MySQL-specific features"
注意事项
1. 模型变更检查
自动生成前:
- 确保 SQLAlchemy 模型已正确修改
- 确保所有导入正确
- 建议先检查模型语法
# 检查模型语法
python -m py_compile openjiuwen_studio/models/xxx.py
2. 生成的脚本审查
生成后:
- 检查生成的迁移脚本是否正确
- 特别注意数据库特定的逻辑
- 确保 upgrade 和 downgrade 逻辑完整
3. 测试环境验证
部署前:
- 在测试环境验证迁移脚本
- 测试 upgrade 和 downgrade
- 确认数据完整性
故障排查
错误1:alembic 命令不可用
错误信息:
❌ 错误: alembic 命令不可用
解决方案:
# 检查 alembic 是否安装
pip list | grep alembic
# 如果未安装,安装 alembic
pip install alembic
错误2:找不到 alembic.ini
错误信息:
❌ 错误: 找不到 alembic.ini 文件
解决方案:
# 确保在 backend 目录下执行
cd backend
python generate_migration.py --autogenerate -m "Test"
错误3:部分数据库生成失败
错误信息:
⚠️ 警告: 1 个数据库生成失败
解决方案:
- 检查错误信息,定位具体问题
- 检查模型定义是否正确
- 检查数据库连接配置
最佳实践
1. 工作流程
# 1. 修改 SQLAlchemy 模型
vim openjiuwen_studio/models/user.py
# 2. 生成迁移脚本
python generate_migration.py --autogenerate -m "feat: add user status field"
# 3. 检查生成的脚本
ls upgrade/*/alembic_*/versions/add_user_status_field_*.py
# 4. 测试迁移
./migrate.sh mysql agent upgrade
# 5. 验证功能
# 运行应用测试相关功能
2. 描述信息规范
命名约定:描述信息必须以 fix: 或 feat: 开头
| 前缀 | 含义 | 使用场景 |
|---|---|---|
fix: |
修复 bug 或问题 | 修复数据库结构缺陷、回退错误变更等 |
feat: |
新增功能或特性 | 添加新表、新字段、新索引等 |
# ✅ 推荐:遵循命名规范
python generate_migration.py --autogenerate -m "feat: add user profile table"
python generate_migration.py --autogenerate -m "fix: correct user email field type"
python generate_migration.py --autogenerate -m "feat: add index on user phone number"
# ❌ 不推荐:缺少前缀或格式错误
python generate_migration.py --autogenerate -m "Add user profile table"
python generate_migration.py --autogenerate -m "update"
python generate_migration.py --autogenerate -m "Add comprehensive user profile management system with advanced features"
3. 版本管理
# 为特定版本生成所有变更
python generate_migration.py --autogenerate -m "feat: v1.2.0 database schema updates"
总结
优势
- ✅ 一次命令:同时为所有数据库生成迁移脚本
- ✅ 减少错误:避免遗漏某个数据库
- ✅ 统一管理:所有迁移脚本使用相同描述
- ✅ 简单易用:清晰的命令行界面
适用场景
- 多数据库项目(MySQL + SQLite)
- 需要保持多个数据库同步
- 频繁进行数据库迁移
快速参考
# 自动生成(最常用)- 必须使用 feat: 或 fix: 前缀
python generate_migration.py --autogenerate -m "feat: add user status field"
python generate_migration.py --autogenerate -m "fix: correct email field type"
# 手动创建
python generate_migration.py --manual -m "feat: custom migration logic"
# 指定数据库
python generate_migration.py --autogenerate -d mysql_agent -m "feat: update agent schema"
# 查看帮助
python generate_migration.py --help
文档版本: v1.0 最后更新: 2025-01-28 适用版本: 所有支持多数据库的项目