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 因为它有挂起的触发事件的主要内容,如果未能解决你的问题,请参考以下文章