DRF项目CI测试报错relation does not exist 本地单元测试可通过
你遇到的relation does not exist报错大概率是CI测试运行逻辑和本地环境存在差异导致,而非Postgres本身的问题,可按照以下方向排查:
常见触发原因
- 迁移文件未提交到远程仓库:本地生成的migrations文件没有随代码push到分支,CI拉取的代码缺失对应表的建表迁移逻辑,测试库初始化时无法创建对应表
- CI脚本遗漏迁移执行步骤:本地测试前你手动执行过迁移操作,但CI配置的测试流程中没有加入
python manage.py migrate步骤,全新的测试库未完成建表就直接跑用例 - 本地开发库存在非迁移生成的表:你本地开发过程中可能手动建过表、或者修改过迁移记录,本地库能找到对应表,但CI从零初始化数据库时完全依赖迁移文件,就会出现表缺失
- 测试代码存在提前执行的数据库操作:如果你的测试用例在模块层、测试类的类属性位置直接调用了数据库查询语句,这部分代码会在Django执行测试库迁移前运行,直接触发表不存在报错
排查方案
- 对比本地
migrations目录和远程仓库对应目录的文件,确认所有新增的迁移文件都已提交 - 查看CI流程的执行日志,确认测试运行前是否正常执行了迁移步骤,可在CI测试命令前增加
python manage.py makemigrations --check校验迁移文件完整性 - 本地新建一个空白Postgres数据库,使用和CI一致的依赖版本,从头执行迁移并运行测试,不要使用平时开发用的旧数据库,即可复现CI环境的报错
- 检查所有测试代码,确认没有在
setUp方法之外的位置直接执行数据库操作
内容的提问来源于stack exchange,提问作者Rain Wu
相关产品推荐
相关产品推荐

