squashmigrations 用法(如何找到“migration_name”)

woo*_*uck 3 django postgresql django-migrations

我正在使用 Django 1.8。

运行时python manage.py squashmigrations myapp我得到这个:

manage.py squashmigrations: error: the following arguments are required: migration_name
Run Code Online (Sandbox Code Playgroud)

我如何找到migration_name

ber*_*uic 5

查找迁移名称的最简单的两个选项是:

  1. migrations在您的应用程序目录中查看您的文件夹
  2. 运行python manage.py showmigrations <app_name>以显示应用程序的所有迁移,以及它们是否被应用。

提示: 您可以在精确迁移的定义中使用唯一前缀。例如,如果您的应用中有以下迁移:

0001_initial
0002_auto_20150809_2248
0003_answer
0004_auto_20150812_0305
Run Code Online (Sandbox Code Playgroud)

你想压扁0004_auto_20150812_0305你就跑

python manage.py showmigrations <app_name> 0004
Run Code Online (Sandbox Code Playgroud)

但是,在某些情况下,您可能会有多个具有特定数量的迁移。如果您合并两个 VCS 分支,其中迁移创建的编号相同,则可能会发生这种情况。幸运的是,Django 通常可以通过运行自动处理这个问题makemigrations --merge,你可能会得到:

0001_initial
0002_auto_20150809_2248
0003_answer
0004_auto_20150812_0305
0006_auto_20150812_0601
0006_cleanup
0007_merge
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您应该真正压缩到合并迁移,但是如果您需要0006专门针对其中之一,只需使用足够的名称,以便 Django 可以区分。使用0006_a应该足以定位0006_auto_20150812_0601. 这也适用于migrate命令。


woo*_*uck -1

更新

这其实是一个微不足道的问题。我也可以只查看 \myproject\myapp\migrations\保存所有迁移文件的文件夹(或使用 psql 查看数据库)。

这是我现在的解决方法:

(venv) mydir> python manage.py squashmigrations myapp 0006
Will squash the following migrations:
 - 0001_initial
 - 0002_auto_20150809_2248
 - 0003_answer
 - 0004_auto_20150812_0305
 - 0005_auto_20150812_0601
 - 0006_auto_20150812_1903
Do you wish to proceed? [yN] N
Run Code Online (Sandbox Code Playgroud)

我只是猜测我跑了多少次migrate,幸运的是它在做任何事情之前都会提示我。所以现在我只需要继续猜测,直到看到类似的东西CommandError: Cannot find a migration matching '0021' from app 'myapp'