如何在Django 1.7中重置迁移

时间:2015-03-25 10:42:18

标签: django migration django-south django-migrations

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

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

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

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

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

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

  1. 运行"进行迁移"和"迁移"在我的开发机器上。
  2. run" migrate"在我的devlopemnt机器上实际进行数据库更改
  3. 复制转换,包括迁移文件。
  4. run" migrate"在生产机器上。 (没有" makemigrations"步骤)
  5. 反正。现在一切都搞得一团糟。我想"重置"我的迁移,从头开始,从现在开始正确地做事。

    我需要做什么?

    1. 删除迁移表的内容(在两台计算机上)?
    2. 删除迁移文件夹的内容? (包括 init .py文件)。
    3. 根据新文档开始迁移。
    4. 我错过了什么吗? 有没有理由为什么从生产中复制所有内容(数据库和迁移文件)之后我的开发机器上没有检测到任何更改

9 个答案:

答案 0 :(得分:51)

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

  1. 删除迁移文件夹
  2. DELETE FROM django_migrations WHERE app = <your app name>。你也可以截断这个表。
  3. python manage.py makemigrations
  4. python manage.py migrate --fake
  5. 在此之后,应该跨环境检测所有更改。

答案 1 :(得分:28)

运行

python manage.py migrate your_app zero

这将从your_app

中删除所有表格

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

python manage.py makemigrations your_app
python manage.py migrate your_app

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

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

# Go to the third migration
python manage.py migrate your_app 0003

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

注意:

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

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

答案 2 :(得分:16)

harshil答案的一个小变化:

$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>

这将...

  • 假装在不触及应用中的实际表格的情况下回滚所有迁移
  • 删除您应用的现有迁移脚本
  • 为应用
  • 创建新的初始迁移
  • 假设迁移到应用的初始迁移

答案 3 :(得分:2)

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

1.重置所有迁移

python manage.py migrate <app_name> zero

<块引用>

ℹ️ 如果这给您带来了问题,您可以在命令末尾添加 --fake 标志。

2.创建迁移

python manage.py makemigrations <app_name>

<块引用>

ℹ️ 仅当您删除或更改迁移文件时才执行此步骤

3.迁移

python manage.py migrate <app_name>

<块引用>

⚠️ 如果您将 --fake 命令添加到第 1 步,则需要将 --fake-initial 添加到 migrate 命令,因此 python manage.py migrate <app_name> --fake-initial

答案 4 :(得分:1)

如果您想完全重置数据库和架构,则将代码放在这样的任何应用程序中

app / management / commands / resetdb.py

import os
import glob
import shutil
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.db import connection


class Command(BaseCommand):
    help = 'Resets the database'

    def handle(self, *args, **options):
        dbname = settings.DATABASES["default"]["NAME"]
        with connection.cursor() as cursor:
            cursor.execute("DROP DATABASE %s" % dbname)
            cursor.execute("CREATE DATABASE %s" % dbname)

        base = str(settings.BASE_DIR)
        migrations = glob.glob(os.path.join(base, "*", "migrations"))

        for migration in migrations:
            shutil.rmtree(migration)

        apps = [migration.split("\\")[-2] for migration in migrations]
        for app in apps:
            os.system("python manage.py makemigrations %s" % app)
        os.system("python manage.py migrate")

现在使用重置它:

python manage.py resetdb

这将

  • 删除数据库
  • 删除迁移文件夹
  • 进行迁移
  • 迁移新数据库

答案 5 :(得分:0)

1)

如果您使用的是Posgres或MySQL之类的数据库系统,并且拥有名为mydb的数据库,请先使用SQL语言删除数据库

delete mydb;

2)

接下来,您需要浏览属于您项目的每个应用程序的所有迁移文件夹,并删除除init.py之外的所有迁移文件

如果您在Linux / MAC下使用终端,则可以自动执行此繁琐的操作。例如

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

3)

接下来,最后要做的就是执行将模型与Django同步到新数据库时通常调用的两个迁移命令

python manage.py makemigrations
python manage.py migrate

如果使用的是sqlite以外的任何数据库系统,请确保在删除旧数据库之后创建了新数据库。

当您的应用因为无法删除数据库而投入生产时,在这种情况下如何重置迁移?

我们只需要在删除迁移历史记录的同时保留数据库。以下是详细步骤的实现方法:

1)

首先浏览每个应用并通过发出以下命令来确定其迁移历史记录

python manage.py migrate --fake myApp zero

Django将取消对特定应用(myApp)的所有先前迁移

2)

接下来,您需要实际删除迁移文件,因此您需要再次浏览每个应用程序迁移文件夹并删除它们(除了init.py之外)。只需在任何基于unix的操作系统下使用以下脚本即可。对于Windows,您可以使用power命令行。应该与unix相似,但是我真诚地不使用Windows和更强大的bash

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

您可以使用:

轻松地验证您的迁移
python manage.py showmigrations

3)

接下来,我们需要再次创建迁移,因此只需执行

python manage.py makemigrations

但是请不要忘记数据库仍然具有属于初始迁移的表,因此我们需要做的是迁移数据库,同时伪造初始迁移,只需执行即可实现

python manage.py migrate --fake-initial 

答案 6 :(得分:0)

所以这个解决方案今天对我有用。

  1. 拖放名为“ django_migrations”的django迁移表 (无需删除整个数据库-只需删除迁移表。)

  2. 从所有应用程序中删除所有迁移文件(例如0002_auto.py等),保留 init .py文件。您可以从Ahmed Bouchefra使用以下代码:

    查找。 -path“ / migrations / .py”-不是-name“ init .py”-删除

    查找。 -path“ / migrations / .pyc”-删除

    (此查找和删除代码仅适用于linux。对于Windows,您必须手动删除文件。)

  3. 现在运行以下命令:

    python manage.py makemigrations

    python manage.py migration --fake

django将创建一个新的迁移表,并在不接触现有数据的情况下将初始迁移伪造到该表中。享受。

答案 7 :(得分:0)

我有一个与此类似的问题,但是当使用python manage.py showmigrations测试这些相同的解决方案时,我注意到我遇到了相同的错误。

最终,我发现了这个post,这使我意识到我正在使事情变得过于复杂,并且本质上定义了两个用户模型。

答案 8 :(得分:0)

这对我有用

第一步:
删除所有应用中的所有“迁移”文件夹

第二步:
创建一个全新的应用程序。
python manage.py justTestApp
将新应用的新“migrations”文件夹复制到所有应用

第三步:
删除“db.sqlite3”文件。
删除“justTestApp”文件夹

第四步:
python manage.py makemigrations
python manage.py migrate