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

TIM*_*MEX 79 python migration django django-south

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

create database mydb;
Run Code Online (Sandbox Code Playgroud)

我在安装的应用程序中添加"南".然后,我转到本教程: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
Run Code Online (Sandbox Code Playgroud)

好的,现在我迁移了.

$ py manage.py migrate wall
Run Code Online (Sandbox Code Playgroud)

但它给了我这个错误......

django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")
Run Code Online (Sandbox Code Playgroud)

所以我使用谷歌(这永远不会奏效,因此问#2我的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
Run Code Online (Sandbox Code Playgroud)

但是当我运行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)
Run Code Online (Sandbox Code Playgroud)

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

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.
Run Code Online (Sandbox Code Playgroud)

好的,好的.我将为初始迁移添加墙.

$ py manage.py schemamigration wall --initial
Run Code Online (Sandbox Code Playgroud)

然后我迁移:

$ py manage.py migrate wall
Run Code Online (Sandbox Code Playgroud)

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

_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")
Run Code Online (Sandbox Code Playgroud)

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

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

那就是S SILLY.

Ken*_*ane 175

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

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

此时您有两种选择.

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

  2. 假出初始运行迁移 $ py manage.py migrate wall 0001 --fake.这会告诉南,你已经有数据库,以便只是假的,这将增加一行到south_migrationhistory表上的表格,以便在下次运行迁移时,将知道第一个迁移已经运行了.

设置一个全新的项目,没有数据库

  1. 创建数据库
  2. 将南方添加到已安装的应用
  3. 运行syncdb,这会将django和南表添加到数据库中
  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它就可以为你改变数据库.

希望有所帮助.

  • 非常好的答案!你的答案应该在文档中. (11认同)
  • 好的答案,肯.您可能会考虑编辑您的答案,以便在此过程中更多地包含实际出错的内容(请参阅上面的评论),以便将来绊倒您的答案的人们获得最佳信息. (3认同)

Cpp*_*ner 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
Run Code Online (Sandbox Code Playgroud)

参考文献:

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解释的/


And*_*rew 8

您正在使用的教程说明:

(如果失败抱怨salt_migrationhistory不存在,则在安装South后忘记运行syncdb .)

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

  1. 加入INSTALLED_APPS.
  2. syncdb.
  3. 然后按照教程.

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