我能删除migrations目录中的Django迁移文件吗

2024-05-12 18:23:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我个人喜欢django的MVC理念。但是当我在版本1.7中运行Django迁移时,我在其中执行的每个迁移都存储在migrations目录中。如果删除这些文件,则在迁移时会抛出错误。

我是这样测试的。我创建了一个新的Django项目并启动了一个git回购。我在Django进行了3-4次迁移,结果 迁移目录下的3-4个迁移文件。我尝试删除非常旧的迁移文件,即(第一个和第二个迁移文件),并尝试运行

python manage.py makemigrations

这确实会导致一些错误,比如“找不到迁移文件”。后来我做了一个git存储,恢复了删除的文件。现在我试着再次运行同样的命令,它运行得很好。

我的问题是,如果一个人在开发期间在数据库中运行大约50个更改,那么所有迁移文件都存储在migrations目录中。是否可以删除这些文件并在不中断的情况下再次更改数据库?


Tags: 文件项目djangopygit版本目录数据库
3条回答

答案是"Do not delete migration files". 为了理解为什么我们不应该删除迁移文件,您需要了解迁移在框架中是如何工作的。 迁移文件是数据库的历史记录。根据以前创建的迁移文件创建一个迁移文件。删除迁移文件意味着丢失历史记录。此历史信息记录在数据库的django_migrations表中。如果删除迁移文件,将出现依赖关系错误。所以Don't try to lose your history by deleting your migration files.

答案是“这取决于”。

如果您正在处理一个生产数据库,或者某个数据库由于任何原因不能周期性地消失,那么您绝对希望保留已应用于您的数据库的迁移文件。它们应该与其他代码一起签入源代码管理。

现在,在像您这样的情况下,放弃50个迁移的最简单方法是销毁db(这是50个迁移),然后根据当前的模型从头开始。在开发过程中,随着模型的发展,周期性地这样做常常是一个好主意。

当你吹走你的数据库时吹走你的模型是可以的,因为syncdb将使用你当前的模型构建一个空白的数据库。然后可以选择使用任何初始fixture填充db。从概念上讲,在这种情况下,不再有任何东西是从这里迁移过来的,因此不需要为旧的数据库保留旧的迁移。它们不再相关。

删除已应用于数据库的迁移文件通常是不好的,除非1)完全删除数据库,或2)先还原迁移。

您可能还希望知道,当您将迁移应用到数据库时,它也会将这些迁移记录在数据库本身的一个特殊表中。这就是为什么当你删除迁移文件时事情会变得一团糟。它们必须与迁移表保持同步

如果要保留数据库,但要减少迁移文件的数量,一个选项是将迁移压缩为一个(或几个,如果是复杂的依赖项)迁移。

从官方文件来看:

You are encouraged to make migrations freely and not worry about how many you have; the migration code is optimized to deal with hundreds at a time without much slowdown. However, eventually you will want to move back from having several hundred migrations to just a few, and that’s where squashing comes in.

在压缩之前,您应该知道Django中的“模型相互依赖关系可能会变得非常复杂,压缩可能会导致不运行”的迁移,因此可能需要手动操作。

有关如何进行挤压的详细信息,请参阅文档:https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations

相关问题 更多 >