squashmigrations 用法(如何查找 'migration_name')

squashmigrations useage (how to find 'migration_name')

我正在使用 Django 1.8。

当 运行 python manage.py squashmigrations myapp 我明白了:

manage.py squashmigrations: error: the following arguments are required: migration_name

如何找到 migration_name

更新

这实际上是一个微不足道的问题。我也可以看看 \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

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

的东西

查看您的文件app_name/migrations。 migration_name 应该是“0001_initial”等

migration_name是yourapp/migrations/

中文件的序号
python manage.py sqlmigrate asset 0001
ll asset/migrations/
total 12
-rw-r--r--. 1 root root 1326 Feb  9 20:17 0001_initial.py
-rw-r--r--. 1 root root 1405 Feb  9 20:20 0001_initial.pyc
-rw-r--r--. 1 root root    0 Feb  5 06:07 __init__.py
-rw-r--r--. 1 root root  140 Feb  5 06:48 __init__.pyc

asset 是我的应用,0001 是 migration_name

要在脚本中以编程方式查找,您可以使用

./manage.py migrate --list <app_name> | tail -1 | cut -d ' ' -f 3

对于一堆应用程序

APPS="asset common product"

for APP in $APPS
do
    # find out the latest migration
    MIGRATION_NAME=`./manage.py migrate -l $APP | tail -1 | cut -d ' ' -f 3`
    ./manage.py squashmigrations $APP $MIGRATION_NAME
done

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

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

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

0001_initial
0002_auto_20150809_2248
0003_answer
0004_auto_20150812_0305

而你想压缩到 0004_auto_20150812_0305 你只是 运行

python manage.py showmigrations <app_name> 0004

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

0001_initial
0002_auto_20150809_2248
0003_answer
0004_auto_20150812_0305
0006_auto_20150812_0601
0006_cleanup
0007_merge

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