我想从TextField中删除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:"footer“列包含空值
我在模式迁移中添加了以下内容:
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
怎么啦?
发布于 2012-10-11 19:06:29
每一次迁移都在一个事务内部。在PostgreSQL中,您不能在一个事务中更新表,然后更改表架构。
您需要将数据迁移和模式迁移分开。首先使用以下代码创建数据迁移:
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
然后创建模式迁移:
manage.py schemamigration fooapp --auto
现在您有了两个事务,两个步骤的迁移应该可以工作了。
发布于 2014-02-26 00:58:06
另一个原因可能是您试图将列设置为NOT NULL
,而它实际上已经具有NULL
值。
发布于 2020-03-24 18:41:58
在操作中,我设置了约束:
operations = [
migrations.RunSQL('SET CONSTRAINTS ALL IMMEDIATE;'),
migrations.RunPython(migration_func),
migrations.RunSQL('SET CONSTRAINTS ALL DEFERRED;'),
]
https://stackoverflow.com/questions/12838111
复制相似问题