如何重置Django 1.7中的迁移?

南方已经有类似的问题了,但是我用Django 1.7开始了我的项目,并没有使用South。

在开发过程中,已经创build了大量的迁移,但是这个软件还没有发布,也没有必须迁移的数据库。 因此,我想重置迁移,就好像我当前的模型是原始模型,并重新创build所有数据库。

推荐的方法是什么?

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

在Django 1.7版本的迁移中,以前在南方的重置function已经被删除,以支持“挤压”迁移的新function。 这应该是保持移动数量的好方法。

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

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

我懂了。 我只是明白了这一点,这是很好的。

 ./manage.py migrate --fake <app-name> zero 

我只是有同样的问题。 这是我的解决方法。

 #!/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" 

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

假设这是你的项目结构,

 project_root/ app1/ migrations/ app2/ migrations/ ... manage.py remove_migrations.py 

您可以从上述位置运行脚本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() 

如果您有一个精心devise的项目,手动删除会很累人。 这节省了我很多时间。 删除迁移文件是安全的。 我已经做了这么多次,没有遇到任何问题。

但是,当我删除了迁移文件夹, makemigrationsmigrate没有为我创build文件夹。 该脚本确保使用其__init__.py的迁移文件夹保持放置状态,只删除迁移文件。

  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)) 
  1. DELETE FROM django_migrations Where app in ('app1', 'app2');

  2. ./manage.py makemigrations

  3. ./manage.py migrate –fake

或者,你可以写这个全部的迁移

我尝试不同的命令,一些答案帮助我。 在我的情况下,只有这个顺序修复了在MYAPP中迁移中的依赖关系,并清除了从头开始的所有过去的迁移。

在这之前,确保数据库已经同步(例如,不要在这里添加新的模型字段或更改元选项)。

 rm -Rf MYAPP/migrations/* python manage.py makemigrations --empty MYAPP python manage.py makemigrations python manage.py migrate --fake MYAPP 0002 

其中0002是上次makemigrations命令返回的迁移编号。

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

如果你不关心以前的迁移,那么删除迁移目录中的所有迁移呢? 您将从头开始迁移序列,将您当前的模型作为参考,就像现在已经编写了整个模型一样。

如果你不相信我足够的移除,那就试着把它们移走。

一个简单的方法是

转到每个应用程序并删除迁移文件。

然后转到数据库中的django-migrtaions表并截断它(删除所有条目)。

之后,您可以再次创build迁移。

cd到src目录cd /path/to/src

删除迁移目录rm -rf your_app/migrations/

请注意,这应该分别为每个应用程序完成

迁移python3.3 manage.py migrate

如果你想再次启动python3.3 manage.py makemigrations your_app

如果你在开发模式,你只是想重置所有的东西(数据库,迁移等),我使用这个脚本基于Abdelhamid巴的答案。 这将擦除数据库(Postgres)的表格,删除所有迁移文件,重新运行迁移并加载我的初始设备:

 #!/usr/bin/env bash echo "This will wipe out the database, delete migration files, make and apply migrations and load the intial fixtures." while true; do read -p "Do you wish to continue?" yn case $yn in [Yy]* ) make install; break;; [Nn]* ) exit;; * ) echo "Please answer yes or no.";; esac done echo ">> Deleting old migrations" find ../../src -path "*/migrations/*.py" -not -name "__init__.py" -delete # Optional echo ">> Deleting database" psql -U db_user -d db_name -a -f ./reset-db.sql echo ">> Running manage.py makemigrations and migrate" ./migrations.sh echo ">> Loading initial fixtures" ./load_initial_fixtures.sh echo ">> Done" 

reset-db.sql文件:

 DO $$ DECLARE r RECORD; BEGIN -- if the schema you operate on is not "current", you will want to -- replace current_schema() in query with 'schematodeletetablesfrom' -- *and* update the generate 'DROP...' accordingly. FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; END LOOP; END $$; 

migration.sh文件:

 #!/usr/bin/env bash cd ../../src ./manage.py makemigrations ./manage.py migrate 

load_initial_fixtures.sh文件:

 #!/usr/bin/env bash cd ../../src ./manage.py loaddata ~/path-to-fixture/fixture.json 

只要确保将path更改为与您的应用程序相对应即可。 我个人将这些脚本放在名为project_root / script / local的文件夹中,django的源文件位于project_root / src中。

删除我的应用程序(手动)中的每个“迁移”文件夹后,我跑:

 ./manage.py dbshell delete from django_migrations; 

然后,我想我可以做./manage.py makemigrations重新生成它们。 但是,没有检测到变化。 然后我试着指定一个应用程序: ./manage.py makemigrations foo ,./ ./manage.py makemigrations bar 。 但是,这导致无法解决的循环依赖关系。

最后,我运行了一个指定所有应用程序的makemigrations命令(没有特别的顺序):

 ./manage.py makemigrations foo bar bike orange banana etc 

这一次,它工作 – 循环依赖被自动解决(在必要时它创build了额外的迁移文件)。

然后我就可以运行./manage.py migrate --fake ,并重新开始工作。