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

时间:2017-03-09 12:39:15

标签: django django-models django-orm django-migrations

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

我正在使用django 1.10

3 个答案:

答案 0 :(得分:29)

文档非常清楚这个

- 假初始

  

如果所有数据库都允许Django跳过应用程序的初始迁移   表格,其中包含所有CreateModel创建的所有模型的名称   该迁移中的操作已经存在。此选项是有意的   用于首次针对数据库运行迁移时使用   预先存在使用迁移。但是,此选项不会检查   用于匹配数据库模式以匹配表名

你问的是风险,这里是

  

如果您对现有架构有信心,则只能安全使用   匹配初始迁移中记录的内容。

- 假

  

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

     

这适用于高级用户操纵当前   如果他们手动应用更改,则直接迁移状态;

再一次明确突出风险

  

要注意使用--fake会冒着迁移的风险   状态表进入需要手动恢复的状态   迁移正确运行。

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

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

答案 1 :(得分:4)

@ e4c5已经就这个问题给出了答案,但我想补充一点,关于何时使用--fake--fake-initial

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

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

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

答案 2 :(得分:0)

简短回答

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

更长的答案:

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

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

  • 所有表已经存在于数据库中:在这种情况下,它的工作方式类似于--fake仅检查表的名称,而不检查其实际架构,因此再次注意
  • 表中的任何一个都已存在于数据库中:在这种情况下,它的工作方式类似于普通迁移
  • 某些表格已经存在:您收到错误消息。无论是您照顾数据库还是django都不会发生这种情况。

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