Django 3.2.9执行migrate时出现TransactionManagementError如何解决
报错原因分析
- 模型代码存在语法错误:
Order模型的placed_at字段使用了Django不存在的参数auto_now_date=True,正确的DateTimeField时间自动填充参数为auto_now_add=True(创建时自动写入时间)或auto_now=True(每次更新时自动写入时间)。该错误导致迁移执行过程异常中断,破坏了迁移记录的写入流程,触发django_migrations表的applied字段非空约束报错。 - 衍生事务错误:后续的
TransactionManagementError是前序异常的衍生问题,迁移执行失败导致当前事务被中断,Django禁止在损坏的事务中继续执行查询。 - 额外注意:
OrderItem模型的quantiy字段名存在拼写错误,正确拼写为quantity,虽然不直接触发本次迁移报错,但会导致后续业务代码调用时出错。
解决步骤
如果你是开发阶段,没有需要保留的生产/测试数据,按以下步骤操作即可解决:
- 第一步:修正models.py代码错误
- 将
Order类的placed_at字段代码替换为:
placed_at = models.DateTimeField(auto_now_add=True)- 可选修正:将
OrderItem类的quantiy字段名修改为quantity
- 将
- 第二步:清理损坏的迁移和数据库文件
- 删除项目根目录下默认的
db.sqlite3数据库文件 - 删除你自行创建的所有App(报错日志中可见的store、likes、tags等)下
migrations目录内,除__init__.py之外的所有文件
- 删除项目根目录下默认的
- 第三步:重新执行迁移流程
依次运行以下命令:python manage.py makemigrations python manage.py migrate
如果有需要保留的现有数据,可先备份数据库文件,手动进入sqlite数据库删除django_migrations表中的异常记录,修正模型错误后重新执行迁移即可。
内容的提问来源于stack exchange,提问作者Hoàng Đức Khánh
相关产品推荐
相关产品推荐

