为什么我的南方移民不工作?


78

首先,创建数据库。

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")

因此,我使用Google(它永远都行不通。因此我在Stackoverflow上问了870个问题),并得到以下页面: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创建了一堆表。是的,它创建了south_migrationhistory表,但也创建了我的应用程序表。

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,然后将其重新添加。

太傻了。


6
就解决方案而言,Ken的答案基本上是正确的,但只是指出出了什么问题,以便您可以从中学到:第二次问题是删除迁移目录。从一个干净的数据库开始:1.为使用它们的应用程序创建迁移,2.运行syncdb,3.运行migration命令。这将使用syncdb创建未迁移的表,并使用south创建已迁移的表。最后一点:当syncdb输出显示“未同步(使用迁移):”时,请务必阅读随后的内容。您没有输出要迁移,因为您没有迁移。
加百利·赫尔利

2
+1可为您的问题提供全面的分析
FilipDupanović2011年

如果要处理多个文件中的类,请检查所有文件中是否都包含app_label!
andilabs

Answers:


175

当您首次使用新应用程序且表尚未添加到数据库时,South允许您创建迁移,以及为数据库中已有表的旧版应用程序创建迁移。关键是要知道何时该做什么。

您的第一个错误是删除迁移文件后,立即删除迁移文件,然后运行syncdb,Django不知道您想再由南方来管理该应用程序,因此它为您创建了表。当您创建最初的迁移然后进行迁移时,South试图创建django已经创建的表,因此会出现错误。

此时,您有两个选择。

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

  2. 伪造初始迁移运行 $ py manage.py migrate wall 0001 --fake这将告诉South您已经在数据库中拥有表,因此只需对其进行伪造即可,这将在south_migrationhistory表中添加一行,以便下次运行迁移时它将知道第一次迁移已经运行了。

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

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

设置旧项目和数据库

  1. 向南添加已安装的应用程序
  2. 运行syncdb,这会将南表添加到数据库中
  3. 为您运行的每个应用程序python manage.py schemamigration app_name --initial创建初始迁移
  4. 对于您运行的每个应用程序python manage.py migrate app_name 0001 --fake,这都会伪造南方,它不会对那些模型的数据库做任何事情,只会将记录添加到south_migrationhistory表中,以便下次您要创建迁移时,您就可以了组。

设置旧项目,无需数据库

  1. 建立资料库
  2. 向南添加已安装的应用程序
  3. 为您运行的每个应用程序python manage.py schemamigration app_name --initial创建初始迁移
  4. 运行syncdb,这会将所有未迁移的应用添加到数据库中。
  5. 然后进行向南迁移,python manage.py migrate这将为您的应用程序运行所有迁移。

现在,您已经设置了south,可以开始使用south来管理对这些应用程序的模型更改。运行的最常见命令是python manage.py schemamigration app_name migration_name --auto查看您上一次运行的迁移,它将找到更改并为您构建一个迁移文件。然后,您只需要运行即可python manage.py migrate为您更改数据库。

希望能有所帮助。


3
好的,肯。您可能会考虑编辑答案,以合并更多实际出错的过程(请参见上面的评论),以便将来偶然发现您答案的人们获得最佳信息。
加百利·赫尔利

@Gabriel我确实喜欢您的建议,并在答案中添加了更多信息。谢谢您的帮助。
肯·科克伦

1
顺便说一句,这是为了接受您的非南方项目并添加南方,而不是让已经使用南方的项目启动并运行。在这些情况下,仅需要syncdb&migration。
布赖恩2012年

11

这就是我让事情正常进行的方式。

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 -向南解释/


8

您正在使用的教程指出:

(如果这失败并抱怨south_migrationhistory不存在,则您在安装South之后忘记运行syncdb 。)

假设您的帖子准确地详细说明了您已执行的步骤,则通过该链接似乎表明您错过了设置新应用程序的步骤。当您遵循在新应用程序上设置迁移的教程时,顺序为:

  1. 加入INSTALLED_APPS
  2. 运行syncdb
  3. 然后按照教程进行操作。

也就是说,syncdb在为新应用添加模型之前,您应该已经运行。从应用程序中删除应用程序的解决方案INSTALLED_APPS应该可以工作,但是值得注意的是,这实际上只是一个“愚蠢”的解决方法,因为您错过了之前的步骤。已经syncdb被运行您创建该应用的模型前,你就不必了变通使用。


3

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

  1. 从您的应用程序目录中删除迁移目录
  2. 从数据库中删除South _migrations
  3. 运行manage.py syncdb
  4. 返回使用南方(例如“ ./manage.py convert_to_south某些东西,。/ manage.py迁移...”)

1

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

即使在阅读了该问题的答案之后,我仍然难以理解如何有效地使用南方。

当然,所有这些都在我阅读文档的那一天发生了变化,South也比您想象的更易于使用。

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文章。


+1我只是说到我对猴子修复所有奇怪的南方错误感到厌倦。不幸的是,关于南方,这并没有太大帮助。也许我真的应该坐下来阅读您所说的文档。
Philip007

0

如何让南方工作并与所有事物正确同步?我唯一能想到的就是从INSTALLED_APPS中删除我的应用程序,然后运行syncdb,然后将其重新添加。

过去,我已将这种解决方案用于南方的麻烦。不是一个很好的解决方案,但非常有效;)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.