Django South – 表已经存在

我正在尝试与南方开始。 我有一个现有的数据库,我加了南( syncdbschemamigration --initial )。

然后,我更新了models.py来添加一个字段并运行./manage.py schemamigration myapp --auto 。 它似乎find了领域,并说我可以申请./manage.py migrate myapp 。 但是,这样做给了错误:

 django.db.utils.DatabaseError: table "myapp_tablename" already exists 

tablenamemodels.py中列出的第一个表格。

我正在运行Django 1.2,南0.7

由于您已经有了在数据库中创build的表,所以您只需要将初始迁移运行为假

 ./manage.py migrate myapp --fake 

确保模型的模式与数据库中表的模式相同。

尽pipe表“myapp_tablename”已经存在错误,但是在执行./manage.py迁移myapp –fake后,发生错误,DatabaseError不显示这样的列:myapp_mymodel.added_field。

得到完全相同的问题!

首先检查造成这种情况的移民人数 。 让我们假设它是:0010。

你需要:

 ./manage.py schemamigration myapp --add-field MyModel.added_field ./manage.py migrate myapp 

如果有多个领域缺失,你必须重复每个领域。

3.现在你着陆了一堆新的迁移,所以删除他们的文件从myapp / migrations(0011,如果你需要添加多个字段进一步)。

运行这个:

 ./manage.py migrate myapp 0010 

现在尝试./manage.py迁移myapp

如果它没有失败,你准备好了。 只要重新检查,如果有任何领域的遗漏。

编辑:

当你有一个生产数据库,你安装南和第一,在其他环境中创build的初始迁移重复你已经在你的数据库中,也可以发生此问题。 这里的解决scheme要容易得多:

  1. 假第一次迁移:

    ./manage migrate myapp 0001 –fake

  2. 与其余的迁移一起滚动:

    ./manage迁移myapp

当我遇到这个错误时,它有一个不同的原因。

在我的情况下,南不知何故在我的数据库中留下了一个临时的空表,这是在_remake_table()中使用 。 可能我以一种我不应该有的方式stream产了。 在任何情况下,每个后续的新迁移,当它调用_remake_table()时,抛出错误sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists ,因为它已经存在,不应该在那里。

_south_new对我来说看起来很奇怪,所以我浏览了我的数据库,看到了桌子_south_new_myapp_mymodel ,划伤了我的脑袋,看着South的源头 , _south_new_myapp_mymodel它是垃圾,放下桌子,一切都很好。

Perform these steps in order may help you

1)python manage.py schemamigration apps.appname –initial

上面的步骤创build迁移文件夹为默认。

2)python manage.py migrate apps.appname –fake

生成一个假的迁移。

3)python manage.py schemamigration apps.appname –auto

然后,您可以根据需要添加字段并执行上述命令。

4)python manage.py迁移apps.appname

如果您的模型与您的数据库不匹配(例如@pielgrzym),并且想要自动迁移数据库以匹配最新的models.py文件(并删除migrate过程中不会由夹具重新创build的所有数据),则:

 manage.py schemamigration myapp --initial manage.py migrate myapp --fake manage.py migrate myapp zero manage.py migrate myapp 

这只会删除和重新创build最新的models.py文件中的数据库表,所以您可能会在以前的syncdb存在垃圾表或migrate数据库。 要摆脱这些,在所有这些迁移之前:

 manage.py sqlclear myapp | manage.py sqlshell 

如果这仍然留下一些CRUFT躺在你的数据库中,那么你必须做一个inspectdb并创buildmodels.py文件(对于你想清除的表和应用程序),然后再执行sqlclear ,然后恢复原始models.py在创build – --initial迁移并迁移到它之前。 所有这些都是为了避免搞乱数据库所需要的SQL的特殊风格。

如果你有一个现有的数据库和应用程序,你可以使用南转换命令

 ./manage.py convert_to_south myapp 

在对数据库中已有内容进行任何更改之前 ,必须先应用此function。

convert_to_south命令只能在你运行的第一台机器上运行。 一旦你完成了对VCS的初始迁移,你将不得不运行./manage.py migrate myapp 0001 --fake在每个拥有代码库副本的机器上创build(确保它们是最新的,date与模型和架构第一)。 ref: http : //south.readthedocs.org/en/latest/convertinganapp.html

作为临时解决scheme,您可以在迁移脚本中注释表创build。

 class Migration(migrations.Migration): dependencies = [ (...) ] operations = [ #migrations.CreateModel( # name='TABLE', # fields=[ # .... # .... # ], #), .... .... 

要么

如果现有的表不包含行(空),则考虑删除如下的表。 (只有当表不包含行时,才build议使用此修补程序 。 在createModel操作之前也要确保这个操作。

 class Migration(migrations.Migration): dependencies = [ (...), ] operations = [ migrations.RunSQL("DROP TABLE myapp_tablename;") ] 

再一个解决scheme(也许是一个临时解决scheme)

 $ python manage.py sqlmigrate APP_NAME MIGRATION_NAME 

例如。,。

 $ python manage.py sqlmigrate users 0029_auto_20170310_1117 

这将列出原始sql查询中的所有迁移。 您可以select要运行的查询,避免创build现有表的部分