Django South-表已存在


187

我正在尝试着南方。我已有一个数据库,并添加了South(syncdbschemamigration --initial)。

然后,我更新models.py以添加一个字段并运行./manage.py schemamigration myapp --auto。似乎找到了领域,并说我可以将其应用./manage.py migrate myapp。但是,这样做会产生错误:

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

tablename是中列出的第一个表格models.py

我正在运行Django 1.2,South 0.7

Answers:


310

由于您已经在数据库中创建了表,因此您只需要以伪造的身份运行初始迁移

./manage.py migrate myapp --fake

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


1
知道了谢谢。它实际上是迁移,而不是schemamigration,但是您的回答使我朝着正确的方向发展。
史蒂夫

1
我的错误只是从OP复制了命令,正确的命令是./manage.py migration myapp --fake
Ashok

在我的情况下,此解决方案无法解决问题。我没有修改数据库,并且使某些视图崩溃了,因为该字段未在表上创建。我不得不评论这个新财产,再次用伪造物迁移以重建一切,而我第二次尝试它确实起作用了,但我仍然不明白... :)
2012年

1
@Ashok也许你还应该指定我们需要重做schemamigration了之前migrate的情况下,我们已经在之前做最后的修改schemamigration
皮埃尔·德·LESPINAY

3
这没有帮助我。我的数据库中已经有一个表,并且在伪造迁移之后,无法添加其他伪造的表。我不得不放下所有桌子重新开始。
Shailen

41

尽管在执行./manage.py迁移myapp --fake之后,表“ myapp_tablename”已经存在错误停止停止上升,但是DatabaseError没有显示此类列:myapp_mymodel.added_field。

有完全一样的问题!

1.首先检查导致此问题的迁移编号。假设它是:0010。

2.您需要:

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

如果缺少多个字段,则必须为每个字段重复该字段。

3.现在,您将获得大量新迁移,因此从myapp / migrations中删除其文件(0011,如果需要添加多个字段,则进一步)。

4.运行

./manage.py migrate myapp 0010

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

如果没有失败,您就准备好了。只要仔细检查是否没有任何字段。

编辑:

当您具有要为其安装South的生产数据库并且在其他环境中创建的第一个初始迁移与您数据库中已有的数据库重复时,也会发生此问题。这里的解决方案要容易得多:

  1. 假第一次迁移:

    ./manage迁移myapp 0001-假

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

    ./manage迁移myapp


10

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

在我的情况下,South不知何故在我的数据库中留下了一个临时空表,用于_remake_table()中。可能我以不应该的方式中止了迁移。在任何情况下,以后每次新的迁移,当它被称为_remake_table(),被扔的错误sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists,因为它没有已经存在,不应该在那里。

_south_new的内容对我来说很奇怪,因此我浏览了数据库,看了看表_south_new_myapp_mymodel,挠了一下头,看了看South的出处,确定它是垃圾,掉了桌子,一切都很好。


这就是我所看到的,如果找到了,将为我节省半个小时的脑部疼痛。相当不愉快-但是这些是临时迁移表,在迁移失败期间会保留下来,可能出于检查目的。我的发生是由于在迁移尝试期间某些数据库完整性问题。
Danny Staple

这需要更高!如果您使用的是不带架构事务的数据库,那么这很容易发生
Yuji'Tomita'Tomita 2013年

2

如果您遇到模型与数据库不匹配的问题(例如@pielgrzym),并且想要自动迁移数据库以匹配最新的models.py文件(并清除在期间固定装置无法重新创建的任何数据migrate):

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

这只会删除并重新创建最新models.py文件中存在的数据库表,因此数据库中的前一个syncdbs或migrates 可能会有垃圾表。要摆脱这些缺陷,请在所有这些迁移之前添加:

manage.py sqlclear myapp | manage.py sqlshell

而且如果仍然在数据库中留下一些CRUFT,那么您必须先执行inspectdbmodels.py从中创建文件(针对您要清除的表和应用程序)sqlclear,然后再还原原始模型。创建--initial迁移并迁移到该迁移。所有这些都是为了避免弄乱数据库所需的特定SQL风格。


1

Perform these steps in order may help you

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

上面的步骤将默认创建迁移文件夹。

2)python manage.py迁移apps.appname --fake

生成伪造的迁移。

3)python manage.py schemamigration apps.appname-自动

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

4)python manage.py迁移apps.appname


1

如果您已有数据库和应用程序,则可以使用south转换命令

./manage.py convert_to_south myapp

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

convert_to_south命令仅在运行它的第一台机器上完全起作用。一旦将初始迁移提交到VCS中,就必须./manage.py migrate myapp 0001 --fake在具有代码库副本的每台计算机上运行(确保它们首先是最新的模型和架​​构)。参考:http : //south.readthedocs.org/en/latest/convertinganapp.html


0

作为临时解决方案,您可以在迁移脚本中注释表的创建。

class Migration(migrations.Migration):

    dependencies = [
        (...)
    ]

    operations = [
        #migrations.CreateModel(
        #    name='TABLE',
        #    fields=[
        #            ....
        #            ....
        #    ],
        #),
        ....
        ....

要么

如果现有表不包含任何行(空),请考虑如下删除表。(仅当表不包含行时才建议使用此修复程序)。另外,还要在createModel操作之前确保此操作。

class Migration(migrations.Migration):

    dependencies = [
        (...),
    ]

    operations = [
        migrations.RunSQL("DROP TABLE myapp_tablename;")
    ]

0

另一种解决方案(可能是临时解决方案)。

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

例如。,。

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

这将列出原始sql查询中的所有迁移。您可以选择要运行的查询,而无需创建现有表的部分

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.