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

2022-01-23 00:00:00 python django migration django-south

问题描述

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

First, I create my database.

create database mydb;

我将南"添加到已安装的应用程序中.然后,我转到本教程:http://south.aeracode.org/docs/tutorial/part1.html

I add "south" to installed Apps. Then, I go to this tutorial: 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

太好了,现在我迁移了.

Great, now I migrate.

$ py manage.py migrate wall

但它给了我这个错误......

But it gives me this error...

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

So I use Google (which never works. hence my 870 questions asked on Stackoverflow), and I get this page: http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

好的,所以我按照说明进行操作

Alright, so I follow that instructions

>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb

但是当我运行 syncdb 时,Django 会创建一堆表.是的,它创建了 south_migrationhistory 表,但它还创建了我的应用程序的表.

But when I run syncdb, Django creates a bunch of tables. Yes, it creates the south_migrationhistory table, but 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)

酷....现在它告诉我迁移这些.所以,我这样做:

Cool....now it tells me to migrate these. So, I do this:

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.

好的,很好.我将在初始迁移中添加墙.

Alright, so fine. I'll add wall to initial migrations.

$ py manage.py schemamigration wall --initial

然后我迁移:

$ py manage.py migrate wall

你知道吗?它给了我这个BS:

You know what? It gives me this BS:

_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")

对不起,这真的让我很生气.有人可以帮忙吗?谢谢.

Sorry, this is really pissing me off. Can someone help ? thanks.

如何让 South 正常工作并与所有内容正确同步?我唯一能想到的就是从 INSTALLED_APPS 中删除我的应用程序,然后运行 ​​syncdb,然后重新添加它.

How do I get South to work and sync correctly with everything? The only thing I can think of is remove my app from INSTALLED_APPS, then run syncdb, then add it back on.

太傻了.


解决方案

South允许您在第一次开始使用新应用并且表尚未添加到数据库时创建迁移,以及创建迁移适用于数据库中已有表的旧版应用程序.关键是知道什么时候该做什么.

South allows you to create migrations when you first start out with a new app and the tables haven't been added to the database yet, as well as creating migrations for legacy apps that already have tables in the database. The key is to know when to do what.

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

Your first mistake was when you deleted your migrations, as soon as you did that, and then ran syncdb, Django didn't know that you wanted south to manage that app anymore, so it created the tables for you. When you created your initial migrations and then ran migrate, south was trying to create tables that django already created, and thus your error.

此时你有两个选择.

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

  1. Delete the tables for the wall app from your database and then run $ py manage.py migrate wall This will run the migration and create your tables.

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

Fake out the initial migration run $ py manage.py migrate wall 0001 --fake This will tell south that you already have the tables on the database so just fake it, which will add a row to the south_migrationhistory table, so that the next time you run a migrate it will know that the first migration has already been run.

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

  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. create your database
  2. add south to installed apps
  3. run syncdb, this will add the django and south tables to the database
  4. add your apps
  5. for each app run python manage.py schemamigration app_name --initial this will create the initial migration files for your app
  6. then run south migrate python manage.py migrate app_name this will add the tables to the database.

设置旧项目和数据库

  1. 将南添加到已安装的应用中
  2. 运行syncdb,这会将南表添加到数据库中
  3. 为您的每个应用运行 python manage.py schemamigration app_name --initial 这将创建您的初始迁移
  4. 为您的每个应用程序运行 python manage.py migrate app_name 0001 --fake ,这将向南伪造,它不会对这些模型的数据库做任何事情,它只会添加记录到 south_migrationhistory 表,以便下次您要创建迁移时,一切就绪.
  1. add south to installed apps
  2. run syncdb, this will add the south tables to the database
  3. for each of your apps run python manage.py schemamigration app_name --initial This will create your initial migrations
  4. for each of your apps run python manage.py migrate app_name 0001 --fake , this will fake out south, it won't do anything to the database for those models, it will just add records to the south_migrationhistory table so that the next time you want to create a migration, you are all set.

设置遗留项目且无数据库

  1. 创建数据库
  2. 将南添加到已安装的应用中
  3. 为您的每个应用运行 python manage.py schemamigration app_name --initial 这将创建您的初始迁移
  4. 运行syncdb,这会将所有没有迁移的应用添加到数据库中.
  5. 然后运行 ​​south migrate python manage.py migrate 这将为您的应用运行所有迁移.
  1. create database
  2. add south to installed apps
  3. for each of your apps run python manage.py schemamigration app_name --initial This will create your initial migrations
  4. run syncdb, this will add any apps that don't have migrations to the database.
  5. then run south migrate python manage.py migrate this will run all migrations for your apps.

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

Now that you are setup with south, you can start using south to manage model changes to those apps. The most common command to run is python manage.py schemamigration app_name migration_name --auto that will look at the last migration you ran and it will find the changes and build out a migration file for you. Then you just need to run python manage.py migrate and it alter your database for you.

希望对您有所帮助.

相关文章