django.db.utils.OperationalError: cannot ALTER TABLE 因为它有挂起的触发事件
Posted
技术标签:
【中文标题】django.db.utils.OperationalError: cannot ALTER TABLE 因为它有挂起的触发事件【英文标题】:django.db.utils.OperationalError: cannot ALTER TABLE because it has pending trigger events 【发布时间】:2017-08-06 02:10:07 【问题描述】:我正在尝试将 accepted_answer
ForeignKey 更改为 BooleanField,并且在迁移时收到错误 django.db.utils.OperationalError: cannot ALTER TABLE "forum_thread" because it has pending trigger events
。这是之前的models.py
:
class Thread(models.Model):
title = models.CharField(max_length=300)
answer_count = models.PositiveIntegerField(default=0)
added_at = models.DateTimeField(auto_now_add=True)
accepted_answer = models.ForeignKey('forum.Post', null=True, blank=True, related_name='+')
【问题讨论】:
【参考方案1】:尝试在一次操作中更新和更改同一个表的架构时似乎会发生此错误。
例如,在从字段中删除 null=True
时,当 makemigrations
提示提供新的默认值后,似乎会出现此错误,因为 Django 试图在更新列的同时更改可空性。
解决方法,视情况而定:
最简单的方法通常是添加具有所需属性的新字段,然后删除旧字段(可能在复制数据之后)。 如果可以通过为所有需要新默认值的字段设置值来避免错误(Django 在迁移期间询问),请在进行迁移/架构更改之前尝试设置这些值。在您的特定情况下,添加一个新字段然后删除旧字段可能是要走的路。
【讨论】:
添加新字段、迁移和删除旧字段是简单的解决方案。另外,根据我的经验,如果遇到此错误,最好获取一个新数据库,然后重新开始迁移。以上是关于django.db.utils.OperationalError: cannot ALTER TABLE 因为它有挂起的触发事件的主要内容,如果未能解决你的问题,请参考以下文章