Django South - 表已经存在

时间:2010-06-22 06:09:48

标签: django django-south

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

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

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

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

我正在运行Django 1.2,South 0.7

8 个答案:

答案 0 :(得分:311)

由于您已经在数据库中创建了表,因此您只需要将初始迁移作为伪造

运行
./manage.py migrate myapp --fake

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

答案 1 :(得分:41)

  

虽然表“myapp_tablename”已存在,但错误停止提升   在我执行./manage.py迁移myapp --fake后,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.Run this:

./manage.py migrate myapp 0010

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

如果没有失败,你就准备好了。如果没有丢失任何字段,只需双重检查。

编辑:

如果您有一个安装了South的生产数据库,并且在其他环境中创建的第一个初始迁移重复了您在db中已有的内容,则也会发生此问题。解决方案在这里更容易:

  1. 假冒第一次迁移:

    ./ manage migrate myapp 0001 --fake

  2. 滚动其余的迁移:

    ./ manage migrate myapp

答案 2 :(得分:10)

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

在我的情况下,South在我的数据库中以某种方式留下了一个临时空表,在_remake_table()中使用。可能我以一种我不应该拥有的方式中止了迁移。在任何情况下,每次后续的新迁移,当它调用_remake_table()时,都会抛出错误sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists,因为它已经存在并且不应该存在。

_south_new位对我来说很奇怪,所以我浏览了我的数据库,看到了桌子_south_new_myapp_mymodel,抓了我的头,看了South's source,认定它是垃圾,丢了桌子,一切都是好。

答案 3 :(得分:2)

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 --auto

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

4)python manage.py migrate apps.appname

答案 4 :(得分:2)

如果您的模型与您的数据库不匹配(如@pielgrzym),并且您希望自动迁移数据库以匹配最新的models.py文件(并清除在{期间不会被灯具重新创建的任何数据) {1}}):

migrate

这将仅删除并重新创建最新manage.py schemamigration myapp --initial manage.py migrate myapp --fake manage.py migrate myapp zero manage.py migrate myapp 文件中存在的数据库表,因此您的数据库中可能包含以前models.pysyncdb的垃圾表。要摆脱这些,请在所有这些迁移之前使用:

migrate

如果仍然在您的数据库中留下一些CRUFT,那么您将必须执行manage.py sqlclear myapp | manage.py sqlshell 并从中创建inspectdb文件(对于要清除的表和应用程序) )在执行models.py之前,然后在创建sqlclear迁移并迁移到它之前恢复原始models.py。所有这些都是为了避免弄乱数据库所需的特定SQL风格。

答案 5 :(得分:1)

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

./manage.py convert_to_south myapp

必须先应用 对数据库中已有的内容进行任何更改。

convert_to_south命令仅在您运行它的第一台机器上完全运行。一旦您提交了它在VCS中进行的初始迁移,您就必须在每个拥有代码库副本的计算机上运行./manage.py migrate myapp 0001 --fake(确保它们首先与模型和模式保持同步)。 参考:http://south.readthedocs.org/en/latest/convertinganapp.html

答案 6 :(得分: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;")
    ]

答案 7 :(得分:0)

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

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

例如,。

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

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