首先,我创建了我的数据库 .
create database mydb;
我将"south"添加到已安装的应用程序中 . 然后,我转到本教程: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表,但 it also creates my app's tables.
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,然后重新添加它 .
That is SO SILLY.
6 回答
这就是我让事情发挥作用的方式 .
参考文献:
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/
South允许您在刚开始使用新应用程序时创建迁移,并且尚未将表添加到数据库中,以及为已在数据库中具有表的旧应用程序创建迁移 . 关键是要知道何时做什么 .
你的第一个错误是当你删除你的迁移时,一旦你这样做了,然后运行了syncdb,Django就不知道你想让南方管理那个应用了,所以它为你创建了表 . 当您创建初始迁移然后运行迁移时,南方尝试创建django已创建的表,从而创建错误 .
此时您有两种选择 .
从数据库中删除墙上应用程序的表,然后运行
$ py manage.py migrate wall
这将运行迁移并创建表 .伪造初始迁移运行
$ py manage.py migrate wall 0001 --fake
这将告诉南方你已经拥有了数据库中的表,所以假装它,它会在south_migrationhistory表中添加一行,以便下次运行迁移时它会知道第一次迁移已经开始 .设置一个全新的项目,没有数据库
创建数据库
将南添加到已安装的应用
运行syncdb,这会将django和南表添加到数据库中
添加您的应用
为每个应用运行
python manage.py schemamigration app_name --initial
这将为您的应用创建初始迁移文件然后运行south migrate
python manage.py migrate app_name
这将把表添加到数据库中 .设置旧项目和数据库
将南添加到已安装的应用
运行syncdb,这会将南表添加到数据库中
为您的每个应用运行
python manage.py schemamigration app_name --initial
这将创建您的初始迁移为你的每个应用程序运行
python manage.py migrate app_name 0001 --fake
,这将伪装成南方,它不会对这些模型的数据库做任何事情,它只会将记录添加到south_migrationhistory表中,以便下次要创建迁移时,都设定好了 .设置旧项目而没有数据库
创建数据库
将南添加到已安装的应用
为您的每个应用运行
python manage.py schemamigration app_name --initial
这将创建您的初始迁移运行syncdb,这将添加任何没有迁移到数据库的应用程序 .
然后运行南迁移
python manage.py migrate
这将运行您的应用的所有迁移 .现在您已经设置了south,您可以开始使用south来管理对这些应用程序的模型更改 . 最常见的命令是
python manage.py schemamigration app_name migration_name --auto
,它将查看您上次运行的迁移,它将找到更改并为您构建迁移文件 . 然后你只需要运行python manage.py migrate
并为你改变你的数据库 .希望有所帮助 .
您正在使用的教程说明:
假设您的帖子准确地详细说明了您所采取的步骤,则该链接似乎表明您在设置新应用之前错过了一个步骤 . 在您阅读有关在新应用程序上设置迁移的教程时,顺序为:
向南添加到
INSTALLED_APPS
.运行
syncdb
.然后按照教程进行操作 .
即,在添加新应用程序的模型之前,您应该已经运行
syncdb
. 你的删除解决方案你的应用程序来自INSTALLED_APPS
应该可以工作,但它真的只是一个"silly"解决方案,因为你错过了之前的一步 . 如果在为该应用程序创建模型之前已经运行了syncdb
,则不必使用解决方法 .仅供将来参考 . 如果南方给你任何问题:
这似乎很明显,但我强烈建议阅读文档 .
即使在阅读了这个问题的答案后,我也很难理解如何有效地使用南方 .
当然,在我阅读文档的那一天,所有这些都发生了变化,你也应该这样做,南方比你想象的更容易使用 .
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文章 .
我过去常常使用南方问题解决这个问题 . 不是一个漂亮的解决方案但非常有效;)
但主要问题是您的订单不正确 . 您应该在本教程之前运行syncdb . 比它工作正常 .