Django:安全删除旧迁移?

     2023-02-23     267

关键词:

【中文标题】Django:安全删除旧迁移?【英文标题】:Django: Safely Remove Old Migrations? 【发布时间】:2020-01-19 21:04:36 【问题描述】:

我有一个 Django 应用程序,其中包含许多过时的迁移。我想删除旧的迁移并重新开始。

该应用有 14 个不同的“迁移”文件夹。

下面是其中一些的样子:

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

【问题讨论】:

如果您还没有为加载数据创建一些自定义迁移,那么可以。删除迁移文件夹中的所有迁移并运行makemigratons 命令应该是安全的。您始终可以复制旧迁移进行备份,除非您将它们存储在 git 等版本控制下。那么就不需要手动备份了。 删除_init_.pycollection.jsonindex.js等文件安全吗? 【参考方案1】:

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

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

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

    删除 /migrations/_pycache_/ 下您未应用的 .pyc 文件。

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

现在您可以轻松创建新的迁移。

如果您要查找的是将所有迁移压缩为一个,请执行上述步骤删除所有迁移,然后运行 ​​python manage.py makemigrations your_app_name 以创建单个迁移文件。之后只需运行 python manage.py migrate your_app_name 即可完成。

【讨论】:

我还是 Django 迁移的新手。我不想取消应用任何迁移。所有创建的迁移都已应用到我的本地开发系统上,并且在开发上一切正常。生产数据库与开发数据库是最新的,所以我不需要将迁移应用到生产。这就是为什么我认为在推送到生产之前删除旧的迁移文件可能会有所帮助。这有意义吗? Django 将最新的迁移信息存储在数据库中。因此,如果您现在删除所有当前迁移并创建新迁移 (0001_initial.py),一旦您在生产数据库上运行 manage.py migrate,您将陷入麻烦。如果您可以删除整个数据库并在运行新迁移后手动从备份中加载数据,则只能删除迁移。 在这种情况下,删除迁移是不安全的,因为您在生产环境中使用了它,并且您的数据库可能已经填充了数据。如果这样做,您的所有数据都将丢失。就像披头士说的,顺其自然吧。 如果您删除迁移,您将无法重现当前的生产设置。图像您破坏了本地数据库。没有办法回去,或者弄清楚生产中正在运行什么(除了跳入生产数据库并手动分析模式)。迁移可帮助您再次达到相同的数据库状态。 @JordanM。删除我的开发数据库后,我在生产中遇到错误,请推荐我做错了什么***.com/questions/63111620/…【参考方案2】:

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

有两步卸载它

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

第一步:清理表

python .\manage.py migrate django_celery_beat zero

第 2 步:从 INSTALLED_APPS 中删除应用

完成了!!!

这是 django document 。

【讨论】:

【参考方案3】:

已将之前提供的答案之一标记为已接受,以下是我学到的一些内容的摘要:

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

我遇到了一些难以修复的错误。这是我为修复它所做的:

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

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

我觉得我很幸运,但上述方法并非在所有情况下都有效!我学到了很多关于 Django 和迁移的知识,以后会更加小心。

【讨论】:

【参考方案4】:
    json 和 js 文件与 django 迁移以及 __pycache__ 文件夹无关。您可以将它们全部删除。 如果您的意思是“以前应用且不再需要,因为项目只需要最新版本的迁移”,您不想删除它们,而是使用 squash 代替 squashmigrations,这将您必须的文件减少到两个、init 文件和初始迁移文件,这样您的项目仍然可以工作。 如果删除意味着您不再需要它们,因为您已经对模型进行了如此多的更改,以至于以前的迁移甚至没有被使用,除了被应用和未应用而从未被使用过,没关系,去到第 2 步并执行此操作,而不是手动删除文件。 当您在应用程序上一一创建迁移时,您还创建了迁移依赖关系树,嗯,django 可以。并且在某个时间点之后确实很难跟踪,如果您尝试删除所有认为可以轻松创建新迁移文件的内容,请相信我作为经历过其他情况的人,它不会那样工作。让 django 处理迁移压缩更简单,它优化了迁移,这意味着它还删除了最终状态中未使用的迁移。

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

【讨论】:

【参考方案5】:

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

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

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

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

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

【讨论】:

请参阅我对 Jordan M 的回复。非常感谢您的建议。 迁移按顺序应用。如果您删除迁移然后需要进行更改,您将无法将新迁移应用到您的生产数据库。不要删除任何内容。 @MadWombat 我在删除我的开发数据库后在生产中遇到错误,请推荐我做错了什么***.com/questions/63111620/…

我的旧项目出现 Django 1.7 迁移问题

】我的旧项目出现Django1.7迁移问题【英文标题】:Django1.7Migrationsissuewithmyoldproject【发布时间】:2015-01-0212:54:56【问题描述】:我有一个django1.5应用程序,现在我将它迁移到django1.7并且应用程序在旧数据库上运行良好。但现在我... 查看详情

重命名 Django 迁移文件是不是安全?

】重命名Django迁移文件是不是安全?【英文标题】:IsitsafetorenameDjangomigrationsfile?重命名Django迁移文件是否安全?【发布时间】:2015-08-0604:49:19【问题描述】:从Django1.8开始,makemigrations命令有一个--name,-noption来为创建的迁移文件... 查看详情

如何在压缩它们后删除 django 迁移?

】如何在压缩它们后删除django迁移?【英文标题】:Howtodeletedjangomigrationsaftersquashingthem?【发布时间】:2015-08-1810:10:52【问题描述】:Django文档说我们可以在压缩迁移后删除它们:您应该提交此迁移,但保留旧迁移;这新迁移将... 查看详情

Django 迁移引用了一个已删除的模块

】Django迁移引用了一个已删除的模块【英文标题】:Djangomigrationsreferenceadeletedmodule【发布时间】:2015-07-1000:25:02【问题描述】:我在my_app/models/foo.py中定义了一个名为FooModel的Model。删除foo.py后,运行Django(1.7)迁移会引发错误,因... 查看详情

在 AlterField django 迁移上转换数据

】在AlterFielddjango迁移上转换数据【英文标题】:ConvertdataonAlterFielddjangomigration【发布时间】:2017-01-3010:00:57【问题描述】:我有一个生产数据库,需要保护数据的安全。我想更改模型中的字段,并使用此更改转换该数据库中的所... 查看详情

删除 Django 应用程序的正确方法是啥?

】删除Django应用程序的正确方法是啥?【英文标题】:What\'stheproperwaytoremoveaDjangoapp?删除Django应用程序的正确方法是什么?【发布时间】:2015-07-2715:39:43【问题描述】:我正在清理一个旧项目。该项目已升级到Django1.8。该项目有... 查看详情

Django - 删除 M2M 字段但保留连接表

】Django-删除M2M字段但保留连接表【英文标题】:Django-deleteM2Mfieldbutkeepjointable【发布时间】:2021-12-1018:17:24【问题描述】:是否可以从模型中删除M2M字段并保留连接表?上下文:我正在尝试将模型添加到现有的M2M字段中,如post中... 查看详情

Django 1.7 迁移不会重新创建删除的表,为啥?

】Django1.7迁移不会重新创建删除的表,为啥?【英文标题】:Django1.7migrationswon\'trecreateadroppedtable,why?Django1.7迁移不会重新创建删除的表,为什么?【发布时间】:2014-12-3001:11:26【问题描述】:使用Django1.7迁移。我不小心在我的数... 查看详情

核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?

】核心数据迁移:除了少数特定对象之外,是不是可以删除旧存储?【英文标题】:CoreDataMigration:Possibletodeleteoldstoreexceptforafewspecificobjects?核心数据迁移:除了少数特定对象之外,是否可以删除旧存储?【发布时间】:2015-07-1620:... 查看详情

Django 删除了迁移目录

】Django删除了迁移目录【英文标题】:Djangodeletedmigrationsdirectory【发布时间】:2016-10-0220:39:03【问题描述】:在我的项目目录中,当我尝试更新我的代码时,我不小心删除了我的应用程序的迁移文件夹,现在我已经修改了模型,... 查看详情

django系列12:django模型关系

迁移分两步实现生成迁移文件执行迁移文件迁移文件的生成根据models文件生成对应的迁移文件根据models和已有迁移文件差别生成新的迁移文件执行迁移文件先去迁移记录查找,哪些文件未迁移过app_label+迁移文件名字执行未迁移... 查看详情

Django 1.8:删除迁移文件夹后未检测到迁移

】Django1.8:删除迁移文件夹后未检测到迁移【英文标题】:Django1.8:Migrationsnotdetectedafterdeletingmigrationsfolder【发布时间】:2015-09-1302:30:22【问题描述】:我不小心删除了迁移文件夹,现在pythonmanage.pymakemigrations没有检测到我的模型... 查看详情

使用 Django 1.7 迁移删除应用程序

】使用Django1.7迁移删除应用程序【英文标题】:RemoveappwithDjango1.7migrations【发布时间】:2015-04-0807:36:37【问题描述】:我想知道使用Django迁移为已删除的应用程序删除所有表的最干净的方法是什么。例如,如果我安装了一个新包... 查看详情

python重命名具有迁移功能的django应用程序已经很糟糕。这是我发现的一种方法,可以保留您的旧迁移历史记录并保留(代码片段)

查看详情

我不小心删除了 Django 中的迁移文件夹

】我不小心删除了Django中的迁移文件夹【英文标题】:IaccidentallydeletedthemigrationsfolderinDjango【发布时间】:2020-06-1616:24:35【问题描述】:我使用Django和Postgre作为数据库。所以我完成了所有迁移,但后来我不小心删除了编辑器中的... 查看详情

Django 迁移损坏,不会忘记已删除的列

】Django迁移损坏,不会忘记已删除的列【英文标题】:Djangomigratebroken,won\'tforgetadeletedcolumn【发布时间】:2015-12-2423:38:49【问题描述】:使用django1.7.5,我通过添加字段对User_Profile进行了更改:school=models.CharField(max_length=255,blank=Tru... 查看详情

Django 1.9 在迁移中删除外键

】Django1.9在迁移中删除外键【英文标题】:Django1.9dropforeignkeyinmigration【发布时间】:2016-11-1316:04:33【问题描述】:我有一个Django模型,它具有另一个模型的外键:classExample(models.Model)something=models.ForeignKey(SomeModel,db_index=True)我想... 查看详情

django 可重用应用程序:删除迁移中的依赖项?

】django可重用应用程序:删除迁移中的依赖项?【英文标题】:djangoreusableapp:removedependenciesinmigrations?【发布时间】:2018-10-1909:19:14【问题描述】:我正在为django-cms编写一个可重用的django应用程序。它将提供一些cms-plugins和一个... 查看详情