--fake-initial vs --fake在Django迁移中有什么区别?

8 浏览
0 Comments

--fake-initial vs --fake在Django迁移中有什么区别?

在Django迁移中,--fake-initial--fake有何不同?使用虚拟迁移的危险性是什么?有人知道吗?非常感谢大家。我正在使用Django 1.10版本。

0
0 Comments

在Django迁移中,有两个参数可以用来处理已经应用过的迁移:--fake和--fake-initial。下面将解释它们的作用和用法。

--fake参数:Django维护了一张名为django_migrations的表,用来记录已经应用过的迁移,以防止意外再次应用它们。--fake参数只是将迁移文件名插入到这个表中,而不会实际运行迁移。这在手动先改变数据库模式,然后再改变模型的情况下非常有用,可以绕过Django的操作。然而,在这一步中,你需要自己处理数据库,以免陷入不一致的状态。

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

- 如果所有表已经存在于数据库中,那么--fake-initial的行为类似于--fake参数。只检查表的名称,而不检查其实际模式,所以需要小心操作。

- 如果数据库中没有任何表存在,那么--fake-initial的行为类似于正常的迁移操作。

- 如果部分表已经存在于数据库中,那么会出现错误。这不应该发生,应该由你自己处理数据库,或者由Django处理。

需要注意的是,只有当迁移文件的类中有initial=True属性时,--fake-initial参数才会起作用,否则该标志会被忽略。此外,这是在迁移中唯一有文档记录的initial=True属性的用法。

总结起来,--fake参数用于将迁移标记为已应用,而--fake-initial参数在不同的数据库状态下有不同的行为。这样,我们可以根据需要选择适当的参数来处理已经应用过的迁移。

0
0 Comments

--fake-initial和--fake是Django迁移命令中常用的选项,用于处理数据库迁移时的一些特殊情况。--fake-initial用于在不破坏现有数据的情况下应用迁移,而--fake则用于重置现有迁移历史。

如果你有一个来自生产环境的数据库,并且想在开发环境中使用它并应用迁移,而又不想破坏数据,那么--fake-initial选项会很有用。--fake-initial会强制Django检查你的迁移文件,并跳过已经存在于数据库中的表的创建过程。但需要注意的是,任何不创建表而是修改现有表的迁移都会被执行。

相反地,如果你有一个已经存在迁移文件的项目,并且想重置现有迁移历史,那么通常使用--fake选项。--fake选项会让Django忽略现有的迁移历史,并将数据库重置为初始状态。

然而,有时候使用--fake-initial可能会导致"table already exists"的错误。解决这个问题的方法是先清空django_migrations表,删除所有迁移文件,然后运行初始迁移并使用--fake选项,因为数据库已经是最新状态,所以初始迁移文件会正确地添加到数据库中,但并不会执行。

总结起来,--fake-initial和--fake是Django迁移命令中的选项,用于处理数据库迁移的特殊情况,其中--fake-initial用于在不破坏现有数据的情况下应用迁移,--fake则用于重置现有迁移历史。

0
0 Comments

在Django迁移中,--fake-initial和--fake是两个常用的选项。--fake-initial选项允许Django跳过应用程序的初始迁移,前提是该迁移涉及的所有CreateModel操作创建的模型所对应的数据库表已经存在。该选项适用于在使用迁移之前已经存在数据库的情况下首次运行迁移。但是,该选项只会检查表名是否匹配,不会检查数据库模式是否匹配。使用--fake-initial选项需要确保现有的模式与初始迁移中记录的模式完全一致。

另一方面,--fake选项告诉Django将迁移标记为已应用或未应用,但不会运行更改数据库模式的SQL语句。这个选项适用于高级用户,可以直接操作当前迁移状态,特别是在手动应用更改时。然而,使用--fake选项存在风险,可能使迁移状态表处于需要手动恢复才能正确运行迁移的状态。

--fake-initial和--fake选项在特定情况下是有用的,但使用时需要注意风险。如果数据库模式与初始迁移不匹配,则使用--fake-initial选项可能导致错误。而使用--fake选项可能使迁移状态表处于不正确的状态,需要手动进行恢复。

这些选项的使用方式和风险在Django的官方文档中已经有明确的说明。所以,在使用这些选项时,需要仔细阅读文档并确保了解其使用方法和潜在风险。

参考链接:

- [Django官方文档:--fake-initial](https://docs.djangoproject.com/en/2.2/ref/django-admin/#cmdoption-migrate-fake)

- [Stack Overflow:migrate --fake and --fake-initial](https://stackoverflow.com/questions/46772762/46774336#46774336)

0