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

标签 python django migration django-south

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

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 不知道你想让 south 再管理那个应用程序,所以它为你创建了表。当您创建初始迁移然后运行迁移时,South 试图创建 django 已经创建的表,因此您的错误。

此时你有两个选择。

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

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

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

  1. 创建您的数据库
  2. 将南添加到已安装的应用中
  3. 运行 syncdb,这会将 django 和 south 表添加到数据库中
  4. 添加您的应用
  5. 为每个应用运行 python manage.py schemamigration app_name --initial 这将为您的应用创建初始迁移文件
  6. 然后运行 ​​south migrate 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. 然后运行 ​​south migrate python manage.py migrate 这将为您的应用运行所有迁移。

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

希望对您有所帮助。

关于python - 为什么我的南迁不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4840102/

相关文章:

asp.net - 在 asp.net mvc 中读取 html 页面

python - 使用 python 字典更新 MongoEngine 文档?

Python删除字符串的最后一个字符,如果它是一个字母

Django 模板计算从现在到特定日期的天数

java - 什么是 VB.Net 中相当于 Now.ToString ("yyyy-MM-dd") 的较短 Java 代码?

.net - Nuget:将多个大型解决方案迁移到 PackageReference

python: zipfile.ZipFile 没有这样的文件或目录

python - Pandas groupby(),agg() - 如何在没有多索引的情况下返回结果?

django - 如何将 django 模板中的多行 html 包含到 javascript 变量中

python - 在 web.py 中返回多行