如何简化Django 1.7中的迁移?

Kit*_*sto 91 django-1.7 django-migrations

南方已有类似的问题,但我已经开始使用Django 1.7进行我的项目,而不是使用South.

在开发过程中,已经创建了许多迁移,但是软件尚未完成,并且不存在必须迁移的数据库.因此,我想重置迁移,就像我当前的模型是原始模型并重新创建所有数据库一样.

建议的方法是什么?

编辑:从Django 1.8开始,有一个名为squashmigrations的新命令,它或多或少地解决了这里描述的问题.

kzo*_*rro 137

我懂了.我只想出来,这很好.

  • `manage.py migrate --fake <app-name> zero`清除迁移表,然后删除<app-name>/migrations /文件夹或内容.然后`manage.py makemigrations <app-name>`最后执行`manage.py migrate --fake <app-name>`.这将在不进行其他数据库更改的情况下整理您的迁移. (17认同)
  • 如果你详细说明一下,这应该是公认的答案. (15认同)
  • 这条线只是一个接一个地反转迁移,直到"零".对于Django迁移系统,`<app-name>`现在是一个新的应用程序,`makemigrations <app-name>`将从`0001`开始.`--fake`可以防止表实际被修改,迁移只应标记为反转,而不是实际应用于模式.(为了完整起见添加小解释,@ tani-rokk,@Fabrizio) (13认同)
  • 伟大的一行答案兄弟,我不知道这是做什么的 (8认同)
  • 这是一个很好的答案.只是删除迁移不会撤消任何错误的迁移损坏.这实际上清理了平板并让你重新开始. (5认同)

tij*_*ijs 36

在Django 1.7版本的迁移中,曾经在南方的重置功能已被删除,有利于"压缩"迁移的新功能.这应该是控制迁移次数的好方法.

https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations

如果您仍然想从头开始,我假设您仍然可以通过清空迁移表并删除之后makemigrations再次运行的迁移.

  • 只是一张纸条.在Django 1.7中,如果您不小心删除迁移文件夹,如果您的模型是另一个的孩子,可能会引发异常`raise KeyError("Migration%s依赖关系引用不存在的父节点%r"%(迁移,父)) ` (4认同)
  • 除了清空迁移表之外,我如何"删除迁移"?我会删除整个文件夹还是只删除00X _*.py文件? (2认同)

Abd*_*rbi 22

我刚遇到同样的问题.这是我的解决方法.

#!/bin/sh
echo "Starting ..."

echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete


# Optional
echo ">> Deleting database"
find . -name "db.sqlite3" -delete

echo ">> Running manage.py makemigrations"
python manage.py makemigrations

echo ">> Running manage.py migrate"
python manage.py migrate

echo ">> Done"
Run Code Online (Sandbox Code Playgroud)

find命令:http://unixhelp.ed.ac.uk/CGI/man-cgi?find

  • 这会删除数据,而不仅仅是迁移 (13认同)
  • 你也应该删除.pyc文件 (2认同)

小智 7

假设这是你的项目结构,

project_root/
    app1/
        migrations/
    app2/
        migrations/
    ...
    manage.py
    remove_migrations.py
Run Code Online (Sandbox Code Playgroud)

您可以从上面指示的位置运行脚本remove_migrations.py以删除所有迁移文件.

#remove_migrations.py
"""
Run this file from a Django =1.7 project root. 
Removes all migration files from all apps in a project.
""" 
from unipath import Path

this_file = Path(__file__).absolute()
current_dir = this_file.parent
dir_list = current_dir.listdir()

for paths in dir_list:
    migration_folder = paths.child('migrations')
    if migration_folder.exists():
        list_files = migration_folder.listdir()
        for files in list_files:
            split = files.components()
            if split[-1] != Path('__init__.py'):
                files.remove()
Run Code Online (Sandbox Code Playgroud)

如果你有一个精心设计的项目,手动删除可能会很累人.这为我节省了很多时间.删除迁移文件是安全的.我已经无数次地完成了这个任务而没有遇到任何问题......

但是当我删除迁移文件夹时,makemigrations或者migrate没有为我创建文件夹.该脚本确保迁移文件夹__init__.py保留,只删除迁移文件.


Ibr*_*tov 6

  1. 删除文件:delete_migrations.py(在prj的根目录中):
import os

for root, dirs, files in os.walk(".", topdown=False):
  for name in files:
      if '/migrations' in root and name != '__init__.py':
          os.remove(os.path.join(root, name))
Run Code Online (Sandbox Code Playgroud)
  1. DELETE FROM django_migrations Where app in ('app1', 'app2');

  2. ./manage.py makemigrations

  3. ./manage.py migrate --fake

或者,您可以从这一切编写迁移


chi*_*ale 5

我尝试不同的命令,一些答案对我有帮助。在我的例子中,只有这个序列修复了 MYAPP 中迁移中损坏的依赖关系,并从头开始清理所有过去的迁移。

在执行此操作之前,请确保数据库已同步(例如,不要在此处添加新的模型字段或更改元选项)。

rm -Rf MYAPP/migrations/*
python manage.py makemigrations --empty MYAPP
python manage.py makemigrations
python manage.py migrate --fake MYAPP 0002
Run Code Online (Sandbox Code Playgroud)

其中 0002 是最后一个 makemigrations 命令返回的迁移编号。

现在您可以正常再次运行 makemigrations / migrate,因为迁移 0002 已存储但未反映在已同步的数据库中。