【问题标题】:Why 'Django Migrate' re-create foreign-key constraint when just adding null=True为什么 'Django Migrate' 在添加 null=True 时重新创建外键约束
【发布时间】:2019-09-19 10:29:35
【问题描述】:

下面是git diffDjango model.py 输出。

-    live = models.ForeignKey('live.Live', on_delete=models.CASCADE,
-                             related_name='live_likes')
+    live = models.ForeignKey('live.Live', on_delete=models.SET_NULL,
+                             related_name='live_likes', null=True)

它们之间的唯一区别是 null=True,我预计 Django 只运行 SQL 删除 NOT NULL

但是,它是Djangosqlmigrate的真正输出。

SET CONSTRAINTS "live_like_live_id_0374bfe6_fk_live_live_id" IMMEDIATE;
ALTER TABLE "live_like" DROP CONSTRAINT "live_like_live_id_0374bfe6_fk_live_live_id";
ALTER TABLE "live_like" ALTER COLUMN "live_id" DROP NOT NULL;
ALTER TABLE "live_like" ADD CONSTRAINT "live_like_live_id_0374bfe6_fk_live_live_id" FOREIGN KEY ("live_id") REFERENCES "live_live" ("id") DEFERRABLE INITIALLY DEFERRED;

令人惊讶的是,它执行了与前一个相同的重新创建外键约束的额外操作。

在 Django 中是否正常?为什么?

我认为这个额外的操作可能会导致生产服务器端的巨大失败。

(Django 2.0.5,PostgreSQL 9.6.9)

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    我刚遇到这个,我相信它是 https://code.djangoproject.com/ticket/25253 在野外的变体。

    tldr 是运行原始 sql 以添加您的约束,并使用 state_operations 指令使 Django 对您的更改感到满意,因此它不会继续重新创建外键。 https://code.djangoproject.com/ticket/25253#comment:15 就是一个很好的例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-05
      • 2012-07-02
      • 1970-01-01
      • 2016-06-27
      • 2019-01-31
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      相关资源
      最近更新 更多