Django迁移中--fake-initial
和--fake
之间有什么区别?使用虚假迁移有哪些危险?有人知道吗?非常感谢大家。
我正在使用django 1.10
答案 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
。 仅检查表的名称,而不检查其实际架构,因此再次注意请注意,仅当迁移文件的类中有--fake-initial
时才考虑使用initial=True
,否则忽略该标志。此外,这是initial=True
在迁移中的唯一记录用法。