Django migrate --fake 和 --fake-initial 解释

标签 django django-models django-migrations

我已经使用 Django 大约 2 年了,有一个功能我一直害怕使用:伪造迁移 .

我几乎到处都看过,我能得到的最多信息来自 documentation它指出:

--假

Tells Django to mark the migrations as having been applied or unapplied, but without actually running the SQL to change your database schema.

This is intended for advanced users to manipulate the current migration state directly if they’re manually applying changes; be warned that using --fake runs the risk of putting the migration state table into a state where manual recovery will be needed to make migrations run correctly.



--fake-initial

Allows Django to skip an app’s initial migration if all database tables with the names of all models created by all CreateModel operations in that migration already exist. This option is intended for use when first running migrations against a database that preexisted the use of migrations. This option does not, however, check for matching database schema beyond matching table names and so is only safe to use if you are confident that your existing schema matches what is recorded in your initial migration.



我明白了一般的想法以及为什么要使用此功能。但是,我不明白它说这是 的部分仅供高级用户使用。

有人可以解释幕后发生的事情以及为什么需要手动恢复。

注意

我不是在寻找在伪造迁移时运行的确切原始 SQL 查询。我只是在寻找幕后发生的事情的一般概念,也许是为什么要伪造迁移的一个例子
将导致 makemigrations 的状态将无法正常工作。

最佳答案

如果您需要合并具有相似模型的两个分支或在它们之间切换,则它与类似于源代码(git)中的合并冲突的数据库问题有关。没有人故意喜欢它。
想象一下,您上周开始修改一个应用程序,可能是因为您发现了一个错误,或者您通过字段或表扩展了应用程序。今天您收到一个更新,但遇到了问题,因为有一个迁移添加了一个仍在您的数据库中的字段,您只能应用该迁移的其他部分。您通过运行查看迁移的 SQL 内容

./manage sqlmigrate some_app 0007_new_migration >customized-some_app-0007_new_migration.sql
将内容与上周所做的更改进行比较,并删除或注释掉仍然适用且无法重复的命令。手动运行所有剩余的 SQL。标记该迁移,就像它会自动应用一样:
./manage migrate --fake some_app 0007_new_migration
如果您破坏了某些东西,可能没有人可以帮助您,因为迁移系统不会更多地了解数据库的当前状态。因此做一个备份,写笔记,使用沙箱并精确工作。
编辑:迁移表 django_migrations 是在所有应用程序中应用的迁移的简单列表。此表中的行应始终与数据库结构处于同步状态。可以通过正常的 migrate 应用迁移. (或未通过反向迁移应用到旧状态,当然通常会丢失一些数据)假迁移仅将更改应用于 django_migrations 表。
me => select * from django_migrations;
 id | app      |          name           |            applied            
----+----------+-------------------------+-------------------------------
  1 | some_app | 0001_initial            | 2017-10-16 06:11:07.31249+02
  2 | some_app | 0002_auto_20171016_1905 | 2017-10-17 02:05:48.979295+02
迁移(文件)是增量更改的描述,也是评估 models.py 之间差异的可能信息。自上次迁移以来,在运行 makemigrations 时进行比较.在某些表最初未受管理并且以后可以被管理的情况下,这也足够了。 (因此也记录了非托管表。)
编辑:一个例子:如何sqlmigrate--fake可用于fix a broken database by migrations (重新创建已删除的表)。
编辑:示例:如果您决定删除某个应用程序的表并通过 migrate 重新创建它们(请注意并查看下面我的评论),您可能还想首先通过伪迁移名称“”重置该应用程序的所有迁移,包括初始迁移。./manage migrate --fake some_app zero .

关于Django migrate --fake 和 --fake-initial 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772762/

相关文章:

python - 检查 count() 后模型索引错误

django - 尝试使用 elastic beanstalk 安装 libjpeg-devel 时出错

Django 1.6b gis导入错误

python-3.x - Django 上的 MakeMigration 错误 - ImportError : cannot import name 'FieldDoesNotExist' from 'django.db.models'

python - Django : makemigrations process does not end

迁移应用程序中缺少 django 1.9 models_module

python - 动态扩展 Django 表单

python - 比较两个字段django过滤器

python - 在 Django 中测试特定模型

python - Django 教程第 1 部分 'Poll' 对象没有改变