2015-03-25 102 views
17

(我知道有一个标题与此相同,但问题不同)。如何重置Django中的迁移1.7

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

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

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

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

我已经通过迁移文档阅读,我看到正确的方式使用它是

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

无论如何。现在都很混乱。我想“重置”我的迁移,并从头开始,从现在开始正确地做事。

我需要做什么?

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

我错过了什么吗? 是否有一个原因,为什么复制从生产(数据库和迁移文件)都没有检测到我的开发机器上的任何变化之后

+0

只需删除迁移文件夹,并创建新的... – rnevius 2015-03-25 10:50:12

+0

做到这一点,它不会检测到更改。另外,您需要保持数据库表与迁移文件夹保持同步。我想知道是否还有其他的东西。 – 2015-03-25 15:40:22

回答

37

我也只是做了双方的环境下单个应用程序(只要该代码是相同的)

  1. 删除您的迁移文件夹
  2. DELETE FROM django_migrations WHERE app = <your app name>。你也可以截断这张表。
  3. python manage.py makemigrations
  4. python manage.py migrate --fake

在此之后所有的修改应在整个环境中检测到。

+0

这听起来或多或少像我最后所做的一样。我尝试删除(实际上重命名django_migrations表)。然后我发现一些应用程序迁移依赖于其他应用程序,所以我重新填充了新的django_migrations表中的条目。 – 2015-03-26 13:15:45

+0

我见过这么多类似问题的答案,使得这个问题比它需要的更复杂。这是做到这一点的方法。清洁和简单。 – 2016-04-07 21:20:09

+0

现在Django不会检测到任何新的更改;即添加一个表格。有任何想法吗? – 2016-04-14 18:12:17

20

运行

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 

所以,想象一下,你的第4迁移是一个烂摊子......你总是可以迁移到3,删除第四迁移文件,然后执行它再次。

注:

你的模型应该在不同的应用程序的原因,这一个。假设你有2个模型:用户和注释。创建2个应用程序是一种很好的做法:用户和笔记,以便迁移彼此独立。

尽量不要使用您的所有车型

+0

删除我的应用程序中的所有表?这绝对不是我们寻找的解决方案。或者我误解了你的措辞? – 2015-03-25 10:59:21

+0

应用程序,而不是项目...无论如何,检查我的编辑...零将清除应用程序上的所有内容,而不是项目,在0001 ... – brunofitas 2015-03-25 11:01:31

+0

感谢您的更新。我尝试删除迁移文件夹,但之后没有发现任何更改。 – 2015-03-25 11:03:30

9

上harshil的回答微小变化:

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

这将...

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

这是我唯一的工作!谢谢! – 2017-02-14 07:53:31

+1

这个为我工作。你可以在'--fake'之前加上'zero'。这就是它对我的工作原理。 – 2017-07-25 12:38:14

+0

我已将它更新为'-h'所说的格式:'用法:./manage.py migrate [options] [app_label] [migration_name]' – rrauenza 2017-09-15 14:40:31