首先,创建数据库。
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")
因此,我使用谷歌(这从来没有工作。因此,我的870个问题上问Stackoverflow),我得到这个页面: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
你知道吗?这让我觉得很无聊:
_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")
抱歉,我真的很生气。谁能帮帮忙?谢谢。
我如何让South正常工作并与所有内容正确同步?我唯一能想到的是从INSTALLED_APPS中删除我的应用程序,然后运行syncdb,然后重新添加它。
这太傻了
6条答案
按热度按时间lfapxunr1#
South允许你在第一次使用一个新的应用程序并且表还没有添加到数据库中时创建迁移,也允许你为数据库中已经有表的遗留应用程序创建迁移,关键是知道什么时候做什么。
你的第一个错误是当你删除了你的迁移,然后运行syncdb时,Django不知道你想让south管理这个应用,所以它为你创建了表。当你创建了你的初始迁移,然后运行migrate时,south试图创建Django已经创建的表,这就是你的错误。
在这一点上你有两个选择。
1.从数据库中删除墙应用的表,然后运行
$ py manage.py migrate wall
这将运行迁移并创建表。1.伪造初始迁移运行
$ py manage.py migrate wall 0001 --fake
这将告诉south您已经在数据库上有了这些表,所以只需伪造它,这将向south_migrationhistory表添加一行,以便下次您运行迁移时,它将知道第一个迁移已经运行。设置全新的项目,但没有数据库
1.创建数据库
1.将南方添加到已安装的应用程序
1.运行syncdb,这将添加django和south表到数据库
1.添加应用程序
1.对于每个运行
python manage.py schemamigration app_name --initial
的应用程序,这将为您的应用程序创建初始迁移文件1.然后运行south migrate
python manage.py migrate app_name
,这将把表添加到数据库中。设置旧项目和数据库
1.将南方添加到已安装的应用程序
1.运行syncdb,这会将south表添加到数据库
1.对于每个应用程序,运行
python manage.py schemamigration app_name --initial
这将创建初始迁移1.对于运行
python manage.py migrate app_name 0001 --fake
的每个应用程序,这将伪装成south,它不会对这些模型的数据库做任何事情,它只会向south_migrationhistory表添加记录,以便下次您想要创建迁移时,一切就绪。设置旧项目,但不设置数据库
1.创建数据库
1.将南方添加到已安装的应用程序
1.对于每个应用程序,运行
python manage.py schemamigration app_name --initial
这将创建初始迁移1.运行syncdb,这将添加尚未迁移到数据库的所有应用程序。
1.然后运行south migrate
python manage.py migrate
这将运行应用程序的所有迁移。现在你已经安装了south,你可以开始使用south来管理对这些应用的模型更改了。最常用的命令是
python manage.py schemamigration app_name migration_name --auto
,它会查看你上次运行的迁移,它会找到更改并为你构建一个迁移文件。然后你只需要运行python manage.py migrate
,它会为你修改你的数据库。q35jwt9p2#
我就是这样让事情运转起来的。
参考文献:
http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.htmlhttp://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/
xxhby3vn3#
您正在使用的教程指出:
(If此操作失败,并报告south_migrationhistory不存在,您在安装South后忘记运行syncdb。)
假设你的帖子准确地详细描述了你所采取的步骤,那么点击该链接似乎表明你在设置新应用程序之前错过了一个步骤。当你在新应用程序上按照教程设置迁移时,顺序是:
1.在
INSTALLED_APPS
上加上 * 南 。1.运行
syncdb
。1. 然后 * 按照教程操作。
也就是说,在为新应用添加模型之前,你应该已经运行了
syncdb
。你从INSTALLED_APPS
中删除应用的解决方案应该会起作用,但值得注意的是,这实际上只是一个“愚蠢”的解决方案,因为你错过了前面的一个步骤。如果在为该应用创建模型之前运行了syncdb
,你就不必使用这个解决方案了。2fjabf4q4#
只是为了将来的参考。如果南方给你任何麻烦:
1.从应用程序目录中删除 migrations 目录
1.从数据库中删除 South_迁移
1.运行 * 管理.py同步数据库 *
1.返回到使用南方(例如."/manage.py convert_to_south something,./manage.py migrate...“)
vojdkbi05#
这似乎是显而易见的,但我强烈建议阅读文档。
即使在阅读了这个问题的答案之后,我也很难理解如何有效地使用南方。
当然,在我阅读文档的那天,这一切都改变了,你也应该改变,南方比你想象的更容易使用。
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文章。
oxosxuxt6#
我如何让South正常工作并与所有内容正确同步?我唯一能想到的是从INSTALLED_APPS中删除我的应用程序,然后运行syncdb,然后重新添加它。
我过去曾用这种方法解决南方的问题,虽然不是一个很好的解决办法,但非常有效;)
但是主要的问题是你的顺序不正确,你应该在学习教程之前运行syncdb,这样它才能正常工作。