Django:安全删除旧迁移?

Django: Safely Remove Old Migrations?

我有一个 Django 应用程序有很多过时的迁移。我想删除旧的迁移并重新开始。

该应用有 14 个不同的 "migrations" 文件夹。

以下是其中一些的样子:

从每个文件夹中删除全部 内容是否安全?或者,我是否必须确保仅删除 一些 文件 - 如果是,哪些文件?

你应该永远不要在取消应用之前删除迁移,否则当你想应用新的迁移时,这将是一场噩梦。

要取消应用迁移,您应该执行以下操作:

  1. 如果您想在 XXXX 迁移后取消应用迁移,请使用 python manage.py migrate your_app_name XXXX。否则使用 python manage.py migrate your_app_name zero 完全取消应用所有迁移。

  2. 删除/migrations/_pycache_/下你没有应用的.pyc文件

  3. 删除 migrations/ 下您未应用的 .py 个文件。

现在您可以毫不费力地创建新的迁移。

如果您要将所有迁移压缩为一个,请执行上述步骤删除所有迁移,然后 运行 python manage.py makemigrations your_app_name 创建一个迁移文件。之后 运行 python manage.py migrate your_app_name 就完成了。

这取决于。如果你有一个生产数据库(或任何你不能简单地删除和重新创建的数据库),那么答案是否定的,你不能安全地删除迁移。

如果您没有任何永久数据库,那么是的,您可以删除所有迁移,运行 python manage.py makemigrations --initial 它将根据您当前的模型创建新的迁移。

此外,您应该检查是否有任何迁移是手写的自定义数据迁移。如果有的话,你可能想保留它们。

通常可以安全删除 .pyc 文件,前提是相关的 .py 文件仍然存在。

您的第一个屏幕截图不是 Django,看起来像是某种 JS 项目。

  1. json 和 js 文件与 django 迁移以及 __pycache__ 文件夹无关。您可以将它们全部删除。
  2. 如果您的意思是 "previously applied and no longer needed as the project only needs the latest version of the migrations" 您不想删除,而是 squash 而是使用 squashmigrations 将它们减少到两个,init 文件和初始迁移文件,这样你的项目仍然有效。
  3. 如果删除意味着您不再需要它们,因为您已经对模型进行了如此多的更改,以至于除了应用和未应用之外甚至没有使用以前的迁移而从未使用过,不需要没关系,转到第 2 步并执行此操作而不是手动删除文件。 当您在应用程序上一个接一个地创建迁移时,您也创建了迁移依赖树,好吧,django 会这样做。并且在某个时间点之后真的很难跟踪,如果你试图删除所有认为你可以轻松创建新迁移文件的东西,相信我作为一个有过其他经历的人,它不会那样工作。让 django 处理迁移压缩要简单得多,它优化了迁移,这意味着它还会删除最终状态下未使用的迁移。

阅读更多内容:https://docs.djangoproject.com/en/2.2/topics/migrations/#migration-squashing

将之前提供的其中一个答案标记为已接受,这里是我学到的一些东西的总结:

  • 删除 Django 迁移通常是一个坏主意
  • Django 通过这些迁移文件以及它在您的数据库中创建的 table 跟踪您的数据库中的内容,如果您删除其中任何一个,Django 将开始在 migrate 很难修复。

我遇到了一些难以修复的错误。这是我修复它的方法:

  • 运行 migrate 在生产服务器上。
  • 当我遇到错误时,它会告诉我数据库与 Django 的预期不同步。我通过使用 sql 客户端直接编辑数据库来手动更正该问题。
  • 例如如果它说存在一个不应该存在的键,我从指示的 table.
  • 中删除了相关索引
  • 或者如果它说 table 存在但不应该存在,我将 table 备份到一个文件,并删除了 table。 Migrate 然后创建了 table,然后我用备份中的数据重新填充它。
  • 在多对多 table 的情况下,一旦 Django 重新创建了它们,我就删除了所有新的 Django 创建的 table,并从备份中恢复它们在我的本地开发系统上创建,其中已经包含所有最新的迁移 运行。

最终我能够成功完成所有迁移。

我觉得我走运了,上面的方法并不适用于所有情况!我学到了很多关于 Django 和迁移的知识,以后会更加小心。

当您从第三个应用导入时:

卸载有两步

例如使用 'django_celery_beat' 应用程序。

第一步:清理table

python .\manage.py migrate django_celery_beat zero

第 2 步:从 INSTALLED_APPS

中删除应用

完成了!!!

这是 django document