Django 2.2升级至3.2后执行测试报create_sql()意外concurrently参数错误
问题原因
这个报错是Django 2.2升3.2版本的常见不兼容问题:
Django 3.2为PostgreSQL后端新增了索引并发创建能力,执行索引创建操作时会给Index.create_sql方法传入新增的concurrently参数,而你项目中要么存在2.2版本生成的旧迁移文件,要么有自定义实现的索引类,没有兼容这个新增参数。
正常运行不会触发全量迁移执行逻辑,只有测试时会走测试库重建、应用全量迁移的流程,所以只有跑测试时会报错。
解决步骤
- 方案1(优先推荐):重生成适配3.2版本的迁移文件
先备份所有app的migrations目录,之后删除每个app下migrations目录中除__init__.py之外的所有文件,执行以下命令重新生成迁移:
新生成的迁移文件的索引定义会自动兼容3.2的参数要求。python manage.py makemigrations - 方案2:兼容自定义索引类
如果项目中有继承自django.db.models.Index的自定义索引子类,给它的create_sql方法新增concurrently参数的默认值即可:# 修改前 def create_sql(self, model, schema_editor): # 原有逻辑 # 修改后 def create_sql(self, model, schema_editor, concurrently=False): # 原有逻辑,不需要使用concurrently参数时直接忽略即可 - 临时规避方案:
如果不需要重写迁移,可在settings.py的测试配置中添加参数跳过序列化环节:DATABASES = { 'default': { # 原有配置 'TEST': { 'SERIALIZE': False, } } }
内容的提问来源于stack exchange,提问作者Jota
相关产品推荐
相关产品推荐

