188

我正在尝试从南方开始。我有一个现有的数据库,并添加了 South ( syncdb, schemamigration --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,南 0.7

4

8 回答 8

313

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

./manage.py migrate myapp --fake

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

于 2010-06-22T06:47:40.800 回答
41

尽管在我执行 ./manage.py migrate 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 migrate myapp

如果它没有失败,你就准备好了。只需仔细检查是否缺少任何字段。

编辑:

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

  1. 伪造第一次迁移:

    ./manage 迁移 myapp 0001 --fake

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

    ./manage 迁移 myapp

于 2011-10-24T13:17:38.980 回答
10

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

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

_south_new 对我来说看起来很奇怪,所以我浏览了我的数据库,看到了表_south_new_myapp_mymodel,挠了挠头,查看了South 的源,确定它是垃圾,丢弃了表,一切都很好。

于 2012-03-30T19:49:38.830 回答
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文件中存在的数据库表,因此您的数据库中可能有来自以前syncdb的 s 或migrates 的垃圾表。要摆脱这些,请在所有这些迁移之前使用:

manage.py sqlclear myapp | manage.py sqlshell

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

于 2014-07-30T19:21:16.743 回答
1

Perform these steps in order may help you

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

上述步骤默认创建迁移文件夹。

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

生成虚假迁移。

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

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

4) python manage.py migrate apps.appname

于 2013-10-23T04:47:00.327 回答
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

于 2014-07-22T12:18:20.093 回答
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;")
    ]
于 2017-04-05T07:19:01.163 回答
0

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

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

例如。,。

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

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

于 2017-04-05T07:22:23.170 回答