为什么我的南迁不行?

首先,我创build我的数据库。

create database mydb; 

我添加“南”来安装应用程序。 然后,我去到这个教程: http : //south.aeracode.org/docs/tutorial/part1.html

教程告诉我这样做:

 $ py manage.py schemamigration wall --initial >>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall 

太棒了,现在我正在迁徙。

 $ py manage.py migrate wall 

但它给了我这个错误…

 django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist") 

所以我使用谷歌(这从来没有工作,因此我的870问题在Stackoverflow问),我得到这个网页: http : //groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

好的,所以我遵循这个指示

 >> Drop database mydb; >> Create database mydb; $ rm -rf ./wall/migrations $ py manage.py syncdb 

但是当我运行syncdb时,Django创build了一堆表。 是的,它创build了south_migrationhistory表,但它也创build了我的应用程序的表。

 Synced: > django.contrib.admin > django.contrib.auth > django.contrib.contenttypes > django.contrib.sessions > django.contrib.sites > django.contrib.messages > south > fable.notification > pagination > timezones > fable.wall > mediasync > staticfiles > debug_toolbar Not synced (use migrations): - (use ./manage.py migrate to migrate these) 

酷…现在它告诉我迁移这些。 所以,我这样做:

 $ py manage.py migrate wall The app 'wall' does not appear to use migrations. 

好,好极了 我将添加墙到最初的迁移。

 $ py manage.py schemamigration wall --initial 

然后我迁移:

 $ py manage.py migrate wall 

你知道吗? 它给了我这个BS:

 _mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists") 

对不起,这真的让我感到厌烦。 有人可以帮忙吗? 谢谢。

我如何让南方人工作和正确地同步一切? 我唯一能想到的是从INSTALLED_APPS中删除我的应用程序,然后运行syncdb,然后重新添加它。

那真是太棒了。

South允许您在首次使用新应用程序开始时创build迁移,并且尚未将表添加到数据库中,还可以为已经在数据库中具有表的旧应用程序创build迁移。 关键是知道什么时候该做什么。

你的第一个错误是,当你删除你的迁移,然后运行syncdb,Django不知道你想要南方来pipe理这个应用程序,所以它为你创build了表。 当你创build你的初始迁移,然后运行迁移时,south正在尝试创builddjango已经创build的表,从而导致你的错误。

在这一点上,你有两个select。

  1. 从数据库中删除挂壁应用程序的表格,然后运行$ py manage.py migrate wall这将运行迁移并创build表格。

  2. 伪造初始迁移运行$ py manage.py migrate wall 0001 --fake这将告诉南方,您已经拥有数据库上的表,所以只需伪造它,这将在south_migrationhistory表中添加一行,以便下一次你运行迁移它会知道第一次迁移已经运行。

build立一个全新的项目,没有数据库

  1. 创build你的数据库
  2. 向南添加安装的应用程序
  3. 运行syncdb,这将把django和南表添加到数据库中
  4. 添加你的应用程序
  5. 为每个应用程序运行python manage.py schemamigration app_name --initial这将为您的应用程序创build初始迁移文件
  6. 然后运行南迁移python manage.py migrate app_name这将添加到数据库的表。

build立遗留项目和数据库

  1. 向南添加安装的应用程序
  2. 运行syncdb,这会将南表添加到数据库中
  3. 为您的每个应用程序运行python manage.py schemamigration app_name --initial这将创build您的初始迁移
  4. 为你的每个应用程序运行python manage.py migrate app_name 0001 --fake ,这将伪造成南,它不会对这些模型的数据库做任何事情,它只会将logging添加到south_migrationhistory表中,以便下次你想创build一个迁移,你全部设置。

build立一个传统的项目,没有数据库

  1. 创build数据库
  2. 向南添加安装的应用程序
  3. 为您的每个应用程序运行python manage.py schemamigration app_name --initial这将创build您的初始迁移
  4. 运行syncdb,这将添加任何没有迁移到数据库的应用程序。
  5. 然后运行南迁移python manage.py migrate这将运行您的应用程序的所有迁移。

现在您已经安装了南方,您可以开始使用南方来pipe理对这些应用程序的模型更改。 运行最常用的命令是python manage.py schemamigration app_name migration_name --auto ,它将查看您运行的上一次迁移,它将查找更改并为您创build迁移文件。 然后你只需要运行python manage.py migrate ,它会改变你的数据库。

希望有所帮助。

这是我如何使事情工作。

 pip install South # add 'south', to INSTALL_APPS, then python manage.py syncdb # For existing project + database python manage.py convert_to_south app_name # Thereafter, call them per model changes python manage.py schemamigration app_name --auto python manage.py migrate app_name 

参考文献:

http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.html http://www.djangopro.com/2011/01/django-database-migration-tool -south解释的/

您正在使用的教程指出:

(如果这个失败,抱怨south_migrationhistory不存在,那么在你安装了南之后 ,你忘了运行syncdb。)

假设您的post准确地详细说明了您采取的步骤,那么遵循该链接似乎表明您在设置新应用程序之前错过了一个步骤。 当您正在按照在新应用程序上设置迁移的教程时,顺序是:

  1. 向南joinINSTALLED_APPS
  2. 运行syncdb
  3. 然后按照教程。

也就是说,在添加新应用程序的模型之前,您应该已经运行了syncdb 。 你从INSTALLED_APPS中移除你的应用程序的解决scheme应该可以工作,但是值得注意的是,它实际上只是一个“愚蠢”的解决方法,因为你之前错过了一个步骤。 如果在创build该应用程序的模型之前运行了syncdb ,则无需使用解决方法。

仅供将来参考。 如果南方给你任何问题:

  1. 从应用程序目录中删除迁移目录
  2. 从数据库中删除South _migrations
  3. 运行manage.py syncdb
  4. 回到使用南(例如'./manage.py convert_to_south东西,./manage.py迁移…')

这似乎很明显,但我强烈build议阅读文档。

即使在阅读这个问题的答案之后,我仍然努力去理解如何有效地使用南方语言。

当然,阅读文档的那一天,你也应该这样做,南方比你想像的更简单。

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

我也发现这有用:

http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

并且确保你阅读Jeff Atwood关于数据库版本控制的Coding Horror文章。

我如何让南方人工作和正确地同步一切? 我唯一能想到的是从INSTALLED_APPS中删除我的应用程序,然后运行syncdb,然后重新添加它。

过去我曾经用南方的麻烦来解决这个问题。 不是一个漂亮的解决scheme,但很有效;)

但主要的问题是你的订单是不正确的。 你应该在教程之前运行syncdb。 比它正常工作。