- Django迁移中的初始vs -fake?

yoo*_*oth 24 django django-models django-orm django-migrations

--fake-initial--fakeDjango迁移有什么区别?使用虚假迁移有哪些危险?有人知道吗?非常感谢大家.

我正在使用django 1.10

e4c*_*4c5 33

那么文档对此非常清楚

--fake-初始

如果所有具有该迁移中所有CreateModel操作创建的模型名称的数据库表已存在,则允许Django跳过应用程序的初始迁移.此选项适用于首次针对预先存在使用迁移的数据库运行迁移时使用.但是,此选项不会检查匹配的表名称之外的匹配数据库架构

你问的是风险,这就是它

只有在您确信现有架构与初始迁移中记录的架构匹配时,才能安全使用.

- 假

告诉Django将迁移标记为已应用或未应用,但没有实际运行SQL来更改数据库架构.

这适用于高级用户在手动应用更改时直接操作当前迁移状态;

再一次明确突出风险

请注意,使用--fake会冒着将迁移状态表置于需要手动恢复以使迁移正确运行的状态的风险.

这个答案不仅适用于django 1.8+版本,也适用于其他版本.

编辑2018年11月:我有时会在这里和其他地方看到答案,这些答案表明你应该放弃你的数据库.这几乎不是正确的事情.如果丢弃数据库,则会丢失所有数据.


blu*_*ote 6

简答

  • --fake 应用迁移
  • --fake-initial 可能会或可能不会应用迁移

更长的答案:

--fake: Django 保留一个表,调用它django_migrations以了解它过去应用了哪些迁移,以防止您不小心再次应用它们。所有--fake做的是插入迁移文件名到该表中,而无需实际运行迁移。如果您先手动更改数据库架构,然后手动更改模型,并且想要绕过 django 的操作,这将非常有用。但是,在该步骤中,您是靠自己的,因此请注意不要以不一致的状态结束。

--fake-initial: 取决于数据库的状态

  • 数据库中已经存在所有表:在这种情况下,它的工作方式类似于--fake. 检查表的名称,而不是它们的实际模式,因此,再次注意
  • 数据库中不存在任何表:在这种情况下,它像正常迁移一样工作
  • 一些表已经存在:你得到一个错误。这不应该发生,要么你负责数据库,要么 django 负责。

请注意,--fake-initial仅当迁移文件initial=True在其类中时才考虑,否则该标志将被忽略。此外,这是唯一记录在案的initial=Truein 迁移用法。


Shu*_*aha 5

@ e4c5已经给出了有关此问题的答案,但我想再添加一件事有关何时使用--fakeand --fake-initial

假设您有一个生产数据库,并且想将其用于开发和应用迁移而又不破坏数据。在这种情况下--fake-initial派上用场。

--fake-initial将迫使Django查看您的迁移文件,并基本上跳过数据库中已经存在的表的创建。不过请注意,任何不创建表(而是修改现有表)的迁移都将运行。

相反,如果您有一个带有迁移文件的现有项目,并且想重置现有迁移的历史记录,则--fake通常使用它。