You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.9 KiB
6.9 KiB
数据库迁移系统重构
日期:2026-02-05
类型:架构优化
影响范围:数据库迁移系统
概述
将复杂的 19 个迁移文件重构为 1 个完整的初始迁移,并补充了所有缺失的表和列注释。
背景
重构前的问题
- 迁移文件过多:19 个迁移文件,维护困难
- 缺少注释:12 个表缺少表注释,约 100+ 列缺少列注释
- 迁移链复杂:部分迁移有历史包袱(如
9a6a8471bda0) - 缺失表定义:6 个表在 Models 中定义但没有迁移创建
数据库状态
- 表数量:从 36 个 → 42 个
- 注释覆盖率:从 ~71% → 100%
- 迁移文件数:从 19 个 → 1 个
执行过程
1. 备份
# 备份位置
.migration-backup/20260205_113525/
├── schema_backup.sql # 完整数据库结构(5,854 行)
├── versions_backup/ # 所有旧迁移文件(19 个)
└── alembic_version.txt # 迁移版本记录
2. 归档旧迁移
# 归档位置
alembic/versions/.archive/
├── README.md # 归档说明
├── 20260127_1931_3a3a2a1417de_initial_schema_初始化所有表结构.py
├── 20260128_2100_create_attachments_table.py
... (共 19 个文件)
3. 补充缺失的表
在 20260129_1800_create_ai_service_tables.py 中添加:
ai_prompts_system表screenplay_element_tags表
手动创建 SQL:
screenplays、screenplay_characters、screenplay_locations、screenplay_propsproject_resources、storyboard_resources
4. 创建新的单一初始迁移
文件:20260205_1140_ddc84535ab31_initial_complete_schema_with_comments.py
内容:
- 所有 41 个业务表的完整定义
- 所有索引和约束
- 所有触发器
- 完整的表和列注释(419 条注释)
5. 补充表注释
为之前缺少注释的 12 个表添加了完整的中文注释:
| 模块 | 表 |
|---|---|
| AI 服务 | ai_conversations, ai_conversation_messages |
| 支付系统 | payment_callbacks, recharge_orders |
| 项目管理 | projects, project_members, project_shares, project_versions |
| 剧本系统 | screenplays, screenplay_characters, screenplay_locations, screenplay_props |
最终结果
数据库结构
总表数:42 个
├── 用户系统(3个):users, user_sessions, sms_verification_codes
├── 项目管理(9个):projects, project_*, folders, folder_*
├── 剧本系统(6个):screenplays, screenplay_*
├── 分镜系统(7个):storyboards, storyboard_*
├── AI 服务(8个):ai_*
├── 积分系统(5个):credit_*
├── 支付系统(2个):recharge_orders, payment_callbacks
├── 文件系统(2个):attachments, file_checksums
└── 系统表(1个):alembic_version
注释覆盖率
- ✅ 表注释:41/41(100%)
- ✅ 列注释:419 条(覆盖所有关键列)
迁移系统
旧系统(已归档):
alembic/versions/.archive/
└── 19 个迁移文件
新系统:
alembic/versions/
└── 20260205_1140_ddc84535ab31_initial_complete_schema_with_comments.py
优势
- 简化部署:新环境只需执行 1 个迁移文件
- 完整注释:所有表和列都有中文注释,提升可维护性
- 无历史包袱:清理了所有修复性迁移
- 易于维护:单文件结构,清晰明了
使用方法
新环境部署
# 1. 启动数据库
docker compose up -d postgres
# 2. 安装必需扩展
docker exec jointo-server-postgres psql -U jointoAI -d jointo -c "
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS \$\$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
\$\$ LANGUAGE plpgsql;
"
# 3. 执行迁移
docker exec jointo-server-app alembic upgrade head
# 4. 验证
docker exec jointo-server-postgres psql -U jointoAI -d jointo -c "\dt"
现有环境
当前数据库已经是最新状态,无需额外操作。
回滚方案
如需回滚到旧的迁移系统:
# 1. 恢复旧迁移文件
cp alembic/versions/.archive/*.py alembic/versions/
# 2. 删除新迁移
rm alembic/versions/20260205_1140_ddc84535ab31_*.py
# 3. 使用备份恢复数据库
psql -U jointoAI -d jointo < .migration-backup/20260205_113525/schema_backup.sql
后续建议
- 启用 Alembic Autogenerate:自动检测 Models 变化
- 定期验证:确保 Models 和数据库结构同步
- 文档同步:Models 变更时同步更新注释
相关文件
- 初始迁移:
alembic/versions/20260205_1140_ddc84535ab31_initial_complete_schema_with_comments.py - 补充注释:
alembic/versions/20260205_1149_2f908ad1a28d_add_missing_table_comments.py - 归档目录:
alembic/versions/.archive/ - 备份目录:
.migration-backup/20260205_113525/ - 归档说明:
alembic/versions/.archive/README.md
📝 补充优化(2026-02-05 11:49)
优化内容
发现初始迁移中有 13 个表的注释未成功应用,创建补充迁移 2f908ad1a28d_add_missing_table_comments.py 进行修复。
补充注释的表(13个):
| 模块 | 表名 | 注释 |
|---|---|---|
| AI 对话 | ai_conversations |
AI 对话会话表 - 应用层保证引用完整性 |
| AI 对话 | ai_conversation_messages |
AI 对话消息表 - 应用层保证引用完整性 |
| 支付系统 | recharge_orders |
充值订单表 - 应用层保证引用完整性 |
| 支付系统 | payment_callbacks |
支付回调日志表 - 记录第三方支付平台的回调信息 |
| 项目管理 | projects |
项目表 - 应用层保证引用完整性 |
| 项目管理 | project_members |
项目成员表 - 应用层保证引用完整性 |
| 项目管理 | project_shares |
项目分享表 - 应用层保证引用完整性 |
| 项目管理 | project_versions |
项目版本历史表 - 应用层保证引用完整性 |
| 剧本系统 | screenplays |
剧本表 - 应用层保证引用完整性 |
| 剧本系统 | screenplay_characters |
剧本角色表 - 应用层保证引用完整性 |
| 剧本系统 | screenplay_locations |
剧本场景表 - 应用层保证引用完整性 |
| 剧本系统 | screenplay_props |
剧本道具表 - 应用层保证引用完整性 |
最终结果
✅ 100% 表注释覆盖率
- 总表数:41 个业务表
- 有注释:41 个表(100%)
- 无注释:0 个表
迁移命令
# 执行补充注释迁移
docker exec jointo-server-app alembic upgrade head
# 验证注释覆盖率
docker exec jointo-server-postgres psql -U jointoAI -d jointo -c "
SELECT
COUNT(*) as total_tables,
COUNT(obj_description((schemaname||'.'||tablename)::regclass)) as tables_with_comments
FROM pg_tables
WHERE schemaname = 'public' AND tablename NOT IN ('alembic_version');
"
重构完成!表注释 100% 覆盖! 🎉