我个人喜欢django的MVC理念。但是当我在版本1.7中运行Django迁移时,我在其中执行的每个迁移都存储在migrations目录中。如果删除这些文件,则在迁移时会抛出错误。
我是这样测试的。我创建了一个新的Django项目并启动了一个git回购。我在Django进行了3-4次迁移,结果 迁移目录下的3-4个迁移文件。我尝试删除非常旧的迁移文件,即(第一个和第二个迁移文件),并尝试运行
python manage.py makemigrations
这确实会导致一些错误,比如“找不到迁移文件”。后来我做了一个git存储,恢复了删除的文件。现在我试着再次运行同样的命令,它运行得很好。
我的问题是,如果一个人在开发期间在数据库中运行大约50个更改,那么所有迁移文件都存储在migrations目录中。是否可以删除这些文件并在不中断的情况下再次更改数据库?
答案是
"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)先还原迁移。
您可能还希望知道,当您将迁移应用到数据库时,它也会将这些迁移记录在数据库本身的一个特殊表中。这就是为什么当你删除迁移文件时事情会变得一团糟。它们必须与迁移表保持同步
如果要保留数据库,但要减少迁移文件的数量,一个选项是将迁移压缩为一个(或几个,如果是复杂的依赖项)迁移。
从官方文件来看:
在压缩之前,您应该知道Django中的“模型相互依赖关系可能会变得非常复杂,压缩可能会导致不运行”的迁移,因此可能需要手动操作。
有关如何进行挤压的详细信息,请参阅文档:https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations
相关问题 更多 >
编程相关推荐