首先,我创建我的数据库。
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,然后重新添加它。
那太傻了。
South 允许您在第一次开始使用新应用程序并且表尚未添加到数据库时创建迁移,以及为数据库中已有表的旧应用程序创建迁移。关键是知道什么时候该做什么。
你的第一个错误是当你删除你的迁移,一旦你这样做,然后运行syncdb,Django不知道你想再管理那个应用程序,所以它为你创建了表。当您创建初始迁移然后运行迁移时,南试图创建 django 已经创建的表,因此您的错误。
此时,您有两个选择。
从数据库中删除墙应用程序的表,然后运行 $ py manage.py migrate wall 这将运行迁移并创建表。伪造初始迁移运行 $ py manage.py migrate wall 0001 --fake 这将告诉南您已经在数据库中拥有表,所以只需伪造它,这将在 south_migrationhistory 表中添加一行,以便下次您运行迁移它会知道第一次迁移已经运行。
建立一个全新的项目,没有数据库
创建您的数据库 添加 south 到已安装的应用程序运行 syncdb,这会将 django 和 south 表添加到数据库中为每个应用程序添加您的应用程序运行 python manage.py schemamigration app_name --initial 这将为您的应用程序创建初始迁移文件然后运行south migrate python manage.py migrate app_name 这会将表添加到数据库中。
设置遗留项目和数据库
将 south 添加到已安装的应用程序运行 syncdb,这将为您运行的每个应用程序将 south 表添加到数据库中 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,这将添加任何没有迁移到数据库的应用程序。然后运行 south migrate python manage.py migrate 这将为您的应用程序运行所有迁移。
现在您已经设置了 south,您可以开始使用 south 来管理对这些应用程序的模型更改。最常见的运行命令是 python manage.py schemamigration app_name migration_name --auto
,它将查看您运行的最后一次迁移,它会找到更改并为您构建一个迁移文件。然后您只需要运行 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-explained/
您正在使用的教程指出:
(如果这失败并抱怨 south_migrationhistory 不存在,那么您在安装 South 后忘记运行 syncdb。)
假设您的帖子准确地详细说明了您已采取的步骤,那么点击该链接似乎表明您在设置新应用程序之前错过了一个步骤。当您遵循在新应用程序上设置迁移的教程时,顺序是:
向南添加到 INSTALLED_APPS。运行同步数据库。然后按照教程进行。
即,在为新应用程序添加模型之前,您应该已经运行 syncdb
。您从 INSTALLED_APPS
中删除您的应用程序的解决方案应该有效,但值得注意的是,这实际上只是一个“愚蠢”的解决方法,因为您之前错过了一步。在您为该应用程序创建模型之前运行 syncdb
,您就不必使用变通方法。
仅供将来参考。如果 South 给您带来任何问题:
从您的应用程序目录中删除迁移目录 从您的数据库中删除 South_migrations 运行 manage.py syncdb 回到使用 South(例如 './manage.py convert_to_south something, ./manage.py migrate ...')
这似乎很明显,但我强烈建议您阅读文档。
即使在阅读了这个问题的答案之后,我也很难理解如何有效地使用 South。
当然,在我阅读文档的那一天,这一切都改变了,你也应该这样做,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 文章。
如何让 South 正常工作并与所有内容正确同步?我唯一能想到的就是从 INSTALLED_APPS 中删除我的应用程序,然后运行 syncdb,然后重新添加它。
过去,我曾在南方问题上使用过该修复程序。不是一个漂亮的解决方案,但非常有效;)
但主要问题是您的订单不正确。您应该在教程之前运行 syncdb。比它正常工作。