Django CI/CD流水线数据库迁移不生效问题排查与解决
解决Django CI/CD迁移不生效的方案
1. 先在本地生成迁移文件并提交仓库
仓库里没有migrations文件夹是核心问题——CI环境每次都是全新拉取代码,执行makemigrations生成的迁移文件只存在于临时容器里,容器销毁后就没了,migrate自然没东西可执行。
- 本地运行
python manage.py makemigrations <app-name>,对应app下会自动生成migrations文件夹和迁移文件 - 把migrations文件夹及里面的所有文件一起提交到代码仓库,确保CI环境能读取到这些文件
2. 调整CI/CD中的迁移命令逻辑
没必要在CI里每次都执行makemigrations,正确流程应该是:
- 代码拉取完成后,直接执行
python manage.py migrate,用仓库里已有的迁移文件同步数据库 - 后续修改模型/新增字段时,都先在本地运行
makemigrations生成新的迁移文件,提交到仓库后,CI执行migrate就能自动同步变更
3. 排查Docker入口命令的问题
检查入口脚本的执行细节:
- 确认
<app-name>拼写完全正确,包括大小写,和实际应用名称一致 - 查看CI日志里
makemigrations和migrate的输出,看是否有报错(比如数据库连接失败、用户权限不足、模型变更未被检测到等) - 确保容器内的Django配置正确指向PostgreSQL,数据库用户拥有创建、修改表的权限
4. 处理已有数据的迁移注意事项
因为数据库已有数据,新增字段时要避免踩坑:
- 如果新增字段是必填项(
null=False且无默认值),直接迁移会失败,需要先设置默认值、允许为空,或者先给现有数据填充对应值再迁移 - 本地测试时可以用
python manage.py migrate --dry-run模拟执行,提前排查问题
5. 验证迁移结果
执行完migrate后,在CI环境里运行python manage.py showmigrations,查看对应应用的迁移状态,确认所有迁移都标记为已应用;也可以直接连接数据库,用SQL命令检查表结构是否更新。
内容的提问来源于stack exchange,提问作者sigmax
相关产品推荐
相关产品推荐

