为什么我的南迁不起作用?

时间:2011-01-29 23:23:13

标签: python django migration django-south

首先,我创建了我的数据库。

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

所以我使用谷歌(它从不起作用。因此我在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")

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

如何让South工作并与所有内容正确同步?我唯一能想到的是从INSTALLED_APPS删除我的应用程序,然后运行syncdb,然后重新添加它。

那是如此。

6 个答案:

答案 0 :(得分:175)

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

你的第一个错误是当你删除你的迁移时,一旦你这样做了,然后运行了syncdb,Django就不知道你想让南方管理那个应用了,所以它为你创建了表。当您创建初始迁移然后运行迁移时,南方尝试创建django已创建的表,从而创建错误。

此时您有两种选择。

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

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

  3. 设置一个全新的项目而没有数据库

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

      1. 将南方添加到已安装的应用
      2. 运行syncdb,这会将南表添加到数据库
      3. 为您的每个应用运行python manage.py schemamigration app_name --initial这将创建您的初始迁移
      4. 对于你的每个应用程序运行python manage.py migrate app_name 0001 --fake,这将假冒南方,它不会对这些模型的数据库做任何事情,它只会添加记录到south_migrationhistory表,以便下次你想要创建一个迁移,你就完成了。
      5. 设置旧项目而无数据库

        1. 创建数据库
        2. 将南方添加到已安装的应用
        3. 为您的每个应用运行python manage.py schemamigration app_name --initial这将创建您的初始迁移
        4. 运行syncdb,这将添加任何没有迁移到数据库的应用程序。
        5. 然后运行南迁移python manage.py migrate这将运行您应用的所有迁移。
        6. 现在您已经设置了south,您可以开始使用south来管理对这些应用程序的模型更改。最常见的命令是python manage.py schemamigration app_name migration_name --auto,它将查看您上次运行的迁移,它将找到更改并为您构建迁移文件。然后你只需要运行python manage.py migrate并为你改变你的数据库。

          希望有所帮助。

答案 1 :(得分:10)

这就是我让事情发挥作用的方式。

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-explained/

答案 2 :(得分:8)

您正在使用的教程说明:

  

(如果失败抱怨   south_migrationhistory不存在,   你忘了运行syncdb after you installed South。)

假设您的帖子准确地详细说明了您所采取的步骤,则该链接似乎表明您在设置新应用之前错过了一个步骤。在阅读有关在新应用程序上设置迁移的教程时,顺序为:

  1. 添加到INSTALLED_APPS
  2. 运行syncdb
  3. 然后按照教程。
  4. 即,在添加新应用的模型之前,您应该已经运行syncdb。您从INSTALLED_APPS删除应用程序的解决方案应该可行,但值得注意的是,它实际上只是一种“愚蠢”的解决方法,因为您错过了之前的步骤。如果在为该应用创建模型之前已经运行syncdb,则无需使用解决方法。

答案 3 :(得分:3)

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

  
      
  1. 从应用目录中删除迁移目录
  2.   
  3. 从数据库中删除 South _migrations
  4.   
  5. 运行 manage.py syncdb
  6.   
  7. 返回使用South(例如'./manage.py convert_to_south something,。/ manage.py migrate ...')
  8.   

答案 4 :(得分:1)

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

即使在阅读了这个问题的答案后,我也很难理解如何有效地使用南方。

当然,在我阅读文档的那一天,所有这些都发生了变化,你也应该这样做,南方比你想象的更容易使用。

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

答案 5 :(得分:0)

  

如何让South工作和同步   正确的一切?唯一的   我能想到的是移除我的应用程序   从INSTALLED_APPS,然后运行syncdb,   然后重新加上它。

我过去常常使用南方问题解决这个问题。不是一个漂亮的解决方案,但非常有效;)

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