为啥我的南迁不起作用?

Posted

技术标签:

【中文标题】为啥我的南迁不起作用?【英文标题】:Why don't my south migrations work?为什么我的南迁不起作用? 【发布时间】:2011-06-17 22:15:28 【问题描述】:

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

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

所以我使用谷歌(它永远不会工作。因此我在 *** 上提出了 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,然后重新添加它。

太傻了。

【问题讨论】:

就解决方案而言,Ken 的回答基本上是正确的,但只是指出出了什么问题,以便您从中吸取教训:删除迁移目录是第二次出现的问题。从一个干净的数据库开始:1. 为使用它们的任何应用程序创建迁移,2. 运行 syncdb,3. 运行 migrate 命令。这将使用 syncdb 创建未迁移的表,并使用 south 创建已迁移的表。最后一点:当 syncdb 输出显示“未同步(使用迁移):”时,请务必阅读之后的实际情况。您的输出中没有要迁移的内容,因为您没有迁移。 +1 用于对您的问题进行全面分析 如果处理多个文件中的类,请检查是否所有文件中都有 app_label! 【参考方案1】:

您正在使用的教程说明:

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

假设您的帖子准确地详细说明了您已采取的步骤,点击该链接似乎表明您在设置新应用之前错过了一个步骤。当您按照教程在新应用程序上设置迁移时,顺序是:

    添加到INSTALLED_APPS。 运行syncdb然后按照教程进行操作。

也就是说,在为新应用添加模型之前,您应该已经运行 syncdb。您从INSTALLED_APPS 中删除您的应用程序的解决方案应该有效,但值得注意的是,这实际上只是一个“愚蠢”的解决方法,因为您之前错过了一步。如果在您为该应用程序创建模型之前运行了 syncdb,您就不必使用变通方法。

【讨论】:

【参考方案2】:

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

我过去曾在南方问题上使用过该修复程序。不是一个漂亮的解决方案,但非常有效;)

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

【讨论】:

【参考方案3】:

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

你的第一个错误是当你删除你的迁移时,一旦你这样做了,然后运行 ​​syncdb,Django 不知道你想再管理那个应用程序,所以它为你创建了表。当您创建初始迁移然后运行迁移时,南试图创建 django 已经创建的表,因此您的错误。

此时你有两个选择。

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

    伪造初始迁移运行 $ py manage.py migrate wall 0001 --fake 这将告诉南您已经在数据库中拥有表,所以只需伪造它,这将在 south_migrationhistory 表中添加一行,以便下次运行迁移时它会知道第一次迁移已经完成运行。

建立一个全新的项目,没有数据库

    创建您的数据库 将南添加到已安装的应用中 运行 syncdb,这会将 django 和 south 表添加到数据库中 添加您的应用 对于每个运行 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,这会将所有没有迁移到数据库的应用添加到数据库中。 然后运行 ​​south migrate python manage.py migrate 这将为您的应用运行所有迁移。

现在您已设置了 south,您可以开始使用 south 来管理对这些应用的模型更改。最常见的运行命令是python manage.py schemamigration app_name migration_name --auto,它将查看您运行的最后一次迁移,它会找到更改并为您构建一个迁移文件。然后你只需要运行python manage.py migrate,它就会为你改变你的数据库。

希望对您有所帮助。

【讨论】:

好答案,肯。您可能会考虑编辑您的答案,以包含更多在此过程中实际出现的问题(请参阅我上面的评论),以便将来偶然发现您的答案的人获得最佳信息。 @Gabriel 我确实喜欢你的建议,并在我的回答中添加了更多信息。感谢您的帮助。 顺便说一句,这是为了获取您的非 South 项目并添加 South,而不是让已经使用 South 的项目启动并运行。在这些情况下,您只需要一个同步数据库和迁移。【参考方案4】:

这就是我的工作方式。

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/

【讨论】:

【参考方案5】:

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

即使在阅读了这个问题的答案后,我仍然难以理解如何有效地使用 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 文章。

【讨论】:

+1 我只是说我厌倦了猴子修复所有奇怪的南方错误。可悲的是,对南方没有太大帮助。也许我真的应该像你说的那样坐下来阅读文档。【参考方案6】:

仅供将来参考。如果 South 给您带来任何问题:

    从您的应用目录中删除 migrations 目录 从您的数据库中删除 South_migrations 运行 manage.py syncdb 返回使用 South(例如,'./manage.py convert_to_south 东西,./manage.py migrate ...')

【讨论】:

以上是关于为啥我的南迁不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Javascript 不起作用?

为啥我的自定义 cookiejar 不起作用?

为啥我的 commandListener 不起作用?

为啥我的 loadUserByUsername 不起作用?

为啥我的 UIButton 不起作用?

为啥我的属性路由不起作用?