如何在Django 1.7中重置迁移

wob*_*col 30 migration django django-south django-migrations

(我知道有一个与此相同的标题,但问题不同).

我设法使我的开发机器迁移和生产迁移不同步.

我有一个使用South的Django应用程序.我有自己的工作流程,工作正常(这可能不是正确的做事方式,但我没有遇到任何问题).

基本上我有一个脚本将生产数据库转储复制到我的开发机器.它还复制了迁移文件.这样两者是同步的,我可以照常运行南方命令.

现在我已升级到1.7,并开始使用迁移.当我使用以前的工作流程(复制数据库转储和生产中的迁移文件)时,它不会检测我的开发计算机上的更改.

我已经阅读了迁移文档,我发现使用它的正确方法是

  1. 在我的开发机器上运行"make migrations"和"migrate".
  2. 在我的devlopemnt机器上运行"migrate"以实际更改数据库
  3. 复制更改,包括迁移文件.
  4. 在生产机器上运行"迁移".(没有"makemigrations"步骤)

无论如何.现在一切都搞得一团糟.我想"重置"我的迁移并从头开始,从现在开始做正确的事情.

我需要做什么?

  1. 删除迁移表的内容(在两台机器上)?
  2. 删除迁移文件夹的内容?(包括init .py文件).
  3. 根据新文档开始迁移.

我错过了什么吗?是否有理由为什么从生产(数据库和迁移文件)复制所有内容后,我的开发机器上都没有检测到任何更改

小智 61

我会在两个环境中执行以下操作(只要代码相同)

  1. 删除迁移文件夹
  2. 从django_migrations删除WHERE app = <your app name>.您也可以截断此表.
  3. python manage.py makemigrations
  4. python manage.py migrate --fake

在此之后,应该跨环境检测所有更改.

  • 我做了这个,但是像Turtles Are Cute一样,不断发现"没有检测到变化"(Django 1.10).解决方案是运行`makemigrations`指定应用程序.例如,`python manage.py makemigrations polls`如果你的应用被称为`polls`. (13认同)
  • 现在 Django 不会检测到任何新的变化;即添加一个表。有任何想法吗? (2认同)

bru*_*tas 35

python manage.py migrate your_app zero
Run Code Online (Sandbox Code Playgroud)

这将从your_app中删除所有表

如果您愿意,既然您说要重新开始,可以删除迁移文件夹,或者重命名文件夹,创建新的迁移文件夹并运行

python manage.py makemigrations your_app
python manage.py migrate your_app
Run Code Online (Sandbox Code Playgroud)

就像南方一样,你总能来回走动......

# Go to the first migration
python manage.py migrate your_app 0001

# Go to the third migration
python manage.py migrate your_app 0003
Run Code Online (Sandbox Code Playgroud)

所以想象你的第四次迁移是一团糟......你总是可以迁移到第三次,删除第四次迁移文件并再次执行.

注意:

这是您的模型应该在不同的应用程序中的原因之一.假设您有2个型号:用户和注意.创建2个应用程序是一个很好的做法:用户和备注,以便迁移彼此独立.

尽量不要为所有模型使用单个应用程序

  • 在我的应用程序上删除所有表?这绝对不是我正在寻找的解决方案。还是我误解了你的措辞? (2认同)
  • 跑为零,没有检测到或改变任何东西。 (2认同)

rra*_*nza 17

harshil答案的一个小变化:

$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>
Run Code Online (Sandbox Code Playgroud)

这将 ...

  • 假装回滚所有迁移而不触及应用程序中的实际表
  • 删除应用程序的现有迁移脚本
  • 为应用程序创建新的初始迁移
  • 假装迁移到应用程序的初始迁移

  • 这个对我有用。你可以在“--fake”之前加上“0”吗?这对我来说就是这样的。 (3认同)

Kha*_*edP 10

要重置所有迁移并重新开始,您可以运行以下命令:

\n

1.重置所有迁移

\n

python manage.py migrate <app_name> zero

\n
\n

\xe2\x84\xb9\xef\xb8\x8f 如果这导致您出现问题,您可以将该--fake标志添加到命令末尾。

\n
\n

2. 创建迁移

\n

python manage.py makemigrations <app_name>

\n
\n

\xe2\x84\xb9\xef\xb8\x8f 仅当您删除或更改迁移文件时才执行此步骤

\n
\n

3. 迁移

\n

python manage.py migrate <app_name>

\n
\n

\xe2\x9a\xa0\xef\xb8\x8f 如果您将命令添加--fake到步骤 # 1,则需要添加--fake-initial到迁移命令,以便python manage.py migrate <app_name> --fake-initial

\n
\n


Jur*_*dil 5

如果你想要一个完全干净的开始,你会想要放弃数据库。这意味着重新创建它,添加权限,重新生成所有迁移,重新运行它们并创建一个超级用户。

好消息是,您可以轻松地将所有这些变成单行/几行命令。

新的迁移文件

如果删除整个文件夹,则必须运行makemigrations提及所有应用程序名称的命令。如果经常这样做就很麻烦了。要让 Django 查看需要迁移的应用程序,您需要保留该migrations文件夹及其__init__.py内部内容。

这是一个 bash 命令:

find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

然后是通常的(这应该为之前进行过迁移的所有应用程序创建迁移):

python manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)

重置数据库

对于SQLite只需删除 DB 文件。

对于PostgreSQL,在控制台中运行:

psql -c "drop database <db_name>;"
psql -c "create database <db_name>;"
psql -c "grant all on database <db_name> to <db_user>;"
Run Code Online (Sandbox Code Playgroud)

然后最后重新运行迁移

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

超级用户

显然你会缺少一个超级用户,所以你可能还想这样做:

python manage.py createsuperuser
Run Code Online (Sandbox Code Playgroud)

无输入的方法是将 python 代码通过管道传输到 shell 中:

echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
Run Code Online (Sandbox Code Playgroud)

一般来说,关于这些非常常见的操作- 帮自己一个忙,写一些 bash。在我使用 Django 的这些年里,它为我节省了很多很多时间。因为比单行命令更好的是拥有一个完整的实用程序文件来存储更多这些方便的函数。然后你可以运行类似的东西:

django --reset_migrations
db --reset <my_db>
django --migrate
Run Code Online (Sandbox Code Playgroud)

如果您发现自己重复相同的几个操作,甚至可以将其聚合为一行。将其添加到您的 bashprofile 中

reset_django() {
    find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
    python manage.py makemigrations
    psql -c "drop database <db_name>;"
    psql -c "create database <db_name>;"
    psql -c "grant all on database <db_name> to <db_user>;"
    python manage.py migrate
    echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
}
Run Code Online (Sandbox Code Playgroud)

我的 Django lite 实用程序的灵感:

#!/bin/bash


django() {

    project_name=$(basename $PWD)
    project_path="$PWD"
    manage_path="${project_path}/${project_name}/manage.py"

    if [ ! -f $manage_path ] ; then  # No project/manage.py
        echo "Error: Could not locate Django manage.py file."
        return -1
    fi

    if [ $# -eq 0 ] ; then
        echo "Django project detected."
    fi

    while [ ! $# -eq 0 ]
        do
            case "$1" in

                --help | -h)
                        echo "Django shortcut, unknown commands are forwarded to manage.py"
                        echo "  -c, --check         Run Django manage.py check."
                        echo "  --req           Install requirements."
                        echo "  -r, --run           Run server."
                        echo "  -s, --shell         Run Django shell plus."
                        echo "  -sd, --shell            Run Django shell plus. Debug DB (print sql)"
                        echo ""
                    ;;

                --check | -c)
                        python $manage_path check
                    ;;

                --shell | -s)
                        python $manage_path shell_plus --bpython
                    ;;

                --shell | -sd)
                        python $manage_path shell_plus --bpython --print-sql
                    ;;

                --run | -r)
                        python $manage_path runserver
                    ;;

                --req)
                        pip install -r $project_path/requirements.txt
                    ;;

                --mig | -m)
                        python $manage_path makemigrations
                        python $manage_path migrate
                    ;;

                --reset_migrations)
                        find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
                        python $manage_path makemigrations
                        ;;

                *)
                    python $manage_path "$@"
                    ;;

            esac
            shift
        done

}
Run Code Online (Sandbox Code Playgroud)