首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django-DB-Migrations:无法更改表,因为它有挂起的触发器事件

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

Stack Overflow用户
提问于 2012-10-11 19:06:29
回答 8查看 58.5K关注 0票数 160

我想从TextField中删除null=True:

代码语言:javascript
复制
-    footer=models.TextField(null=True, blank=True)
+    footer=models.TextField(blank=True, default='')

我创建了一个模式迁移:

代码语言:javascript
复制
manage.py schemamigration fooapp --auto

因为一些脚注列包含NULL,所以如果我运行迁移,我会得到这个error

django.db.utils.IntegrityError:"footer“列包含空值

我在模式迁移中添加了以下内容:

代码语言:javascript
复制
    for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
        sender.footer=''
        sender.save()

现在我明白了:

代码语言:javascript
复制
django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events

怎么啦?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-10-11 19:06:29

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

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

代码语言:javascript
复制
 for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
    sender.footer=''
    sender.save()

然后创建模式迁移:

代码语言:javascript
复制
manage.py schemamigration fooapp --auto

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

票数 168
EN

Stack Overflow用户

发布于 2014-02-26 00:58:06

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

票数 174
EN

Stack Overflow用户

发布于 2020-03-24 18:41:58

在操作中,我设置了约束:

代码语言:javascript
复制
operations = [
    migrations.RunSQL('SET CONSTRAINTS ALL IMMEDIATE;'),
    migrations.RunPython(migration_func),
    migrations.RunSQL('SET CONSTRAINTS ALL DEFERRED;'),
]
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12838111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档