Django DB迁移:无法更改表,因为它有挂起的触发器事件

2024-04-20 02:26:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我要从文本字段中删除null=True:

-    footer=models.TextField(null=True, blank=True)
+    footer=models.TextField(blank=True, default='')

我创建了架构迁移:

manage.py schemamigration fooapp --auto

由于某些页脚列包含NULL,因此如果运行迁移,我会得到这个error

django.db.utils.IntegrityError: column "footer" contains null values

我将此添加到架构迁移:

    for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
        sender.footer=''
        sender.save()

现在我明白了:

django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events

怎么了?


Tags: django文本truedefaultdbmanagemodels架构
3条回答

刚刚碰到这个问题。您还可以在架构迁移中使用db.start_transaction()和db.commit_transaction(),将数据更改与架构更改分开。可能不太干净,无法进行单独的数据迁移,但在我的情况下,我需要模式、数据,然后再进行另一个模式迁移,因此我决定一次完成所有迁移。

每次迁移都在事务中。在PostgreSQL中,不能更新表,然后在一个事务中更改表架构。

您需要分离数据迁移和模式迁移。首先使用以下代码创建数据迁移:

 for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
    sender.footer=''
    sender.save()

然后创建架构迁移:

manage.py schemamigration fooapp --auto

现在您有两个事务,两个步骤中的迁移应该可以工作了。

另一个原因可能是您试图将一个列设置为NOT NULL,而实际上它已经有NULL个值。

相关问题 更多 >