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.
3.1 KiB
3.1 KiB
修复文件夹迁移脚本重复创建表问题
日期: 2026-01-29
类型: Bug 修复
影响范围: 数据库迁移系统
问题描述
使用 ./start_docker.sh -c 清除数据库后重新部署时,迁移脚本执行失败:
asyncpg.exceptions.DuplicateTableError: relation "users" already exists
根本原因
- 初始迁移
3a3a2a1417de已经创建了users和user_sessions表 - 后续迁移
20260129_1500又尝试创建相同的表 - 导致迁移链重复创建表,在清空数据库后重新迁移时失败
解决方案
1. 删除重复的迁移脚本
删除 server/alembic/versions/20260129_1500_create_users_and_sessions.py,因为:
users表已在初始迁移3a3a2a1417de中创建user_sessions表也已在初始迁移中创建- 该迁移脚本完全重复,无实际作用
2. 修复迁移链依赖
修改 20260129_1600_fix_folder_timestamp_timezone.py:
# 修改前
down_revision = '20260129_1500'
# 修改后
down_revision = '20260129_1410'
修改文件
删除文件
server/alembic/versions/20260129_1500_create_users_and_sessions.py
修改文件
server/alembic/versions/20260129_1600_fix_folder_timestamp_timezone.py- 修改
down_revision从20260129_1500改为20260129_1410
- 修改
验证结果
迁移链验证
$ docker exec jointo-server-app alembic current
20260129_1600 (head)
数据库表验证
$ docker exec jointo-server-postgres psql -U jointoAI -d jointo -c "\d folders"
确认 folders 表的时间字段正确使用 TIMESTAMPTZ:
created_at:timestamp with time zoneupdated_at:timestamp with time zonedeleted_at:timestamp with time zone
影响
正面影响
- ✅ 修复了
./start_docker.sh -c清空数据库后无法重新迁移的问题 - ✅ 清理了重复的迁移脚本,保持迁移历史清晰
- ✅ 确保迁移链的完整性和一致性
注意事项
- ⚠️ 已部署的环境不受影响(迁移版本已经跳过
20260129_1500) - ⚠️ 新部署的环境将直接跳过已删除的迁移脚本
最佳实践
避免重复迁移
- 检查初始迁移:创建新迁移前,先检查表是否已在初始迁移中创建
- 使用
alembic history:查看完整的迁移历史 - 测试清空重建:定期测试
./start_docker.sh -c确保迁移链完整
迁移脚本规范
# 查看迁移历史
docker exec jointo-server-app alembic history
# 查看当前版本
docker exec jointo-server-app alembic current
# 检查表是否存在
docker exec jointo-server-postgres psql -U jointoAI -d jointo -c "\dt"
相关文档
技术债务
无
后续工作
- 运行文件夹 API 集成测试
- 验证所有服务的迁移脚本无重复
- 更新部署文档,说明迁移链的维护规范