alter_column(字段更改)后,CREATE INDEX上的Django南错误

时间:2013-01-23 10:29:54

标签: django django-south migrate

我改变了我的模型

class HardwareModel(models.Model):
    name = models.CharField(max_length=128,unique=True)
    series =models.CharField(max_length=128)
    def __unicode__(self):
        return "%s" % (self.name)

class HardwareModel(models.Model):
    name = models.CharField(max_length=128,unique=True)
    series = models.ForeignKey(HardwareModelSeries, blank=True)
    def __unicode__(self):
        return "%s" % (self.name)

我用南方移民。 (使用--auto,因此迁移脚本由南方制作)

    # Renaming column for 'HardwareModel.series' to match new field type.
    db.rename_column('iamictinfra_hardwaremodel', 'series', 'series_id')
    # Changing field 'HardwareModel.series'
    db.alter_column('iamictinfra_hardwaremodel', 'series_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['iamictinfra.HardwareModelSeries']))
    # Adding index on 'HardwareModel', fields ['series']
    db.create_index('iamictinfra_hardwaremodel', ['series_id'])

现在,在创建一个全新的sqllite数据库时(在测试期间),它会出现此错误:

south DEBUG execute "CREATE INDEX "iamictinfra_hardwaremodel_b18a98d" ON "iamictinfra_hardwaremodel" ("series_id");" with params "[]"
FATAL ERROR - The following SQL query failed: CREATE INDEX "iamictinfra_hardwaremodel_b18a98d" ON "iamictinfra_hardwaremodel" ("series_id");
The error was: index iamictinfra_hardwaremodel_b18a98d already exists

现在我可以删除create index命令,但我不确定它是否适用于生产服务器(mySql)。

另一种选择可能是更改脚本并删除列,而不是改变它... 但是,我进行了大量的迁移......我认为在旧的迁移中搞乱是有点棘手的..... 我试着抓住它试试......

也可能是这个脚本是使用较旧的南版本制作的....而在较新版本中,索引也会在更改列时重命名...而在旧版本中它不是......

我正在使用南0.7.6(目前的最新版本)。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你可能已经想出来了,如果是的话,你可以发布你的解决方案吗?

我自己也有同样的问题。我通过删除索引创建行来解决它。 迁移在生产中成功(mysql)。

在查看源代码后,似乎改变操作已经自动为fk创建索引,所以我猜create_index是不必要的。

答案 1 :(得分:0)

@Mariodev 很抱歉让你失望,我没有找到任何解决办法。

由于sqlite不被南方开发社区视为django的真正数据库选项......在不久的将来看起来没有任何解决方案。 也许它在这里说的有点复杂,我认为它也与在开发服务器(runserver)上运行它的东西有关。

在我的情况下,sqlite数据库只是我的开发和测试数据库(生产在mySQL上运行)

mySql中没有出现问题

所以我的“解决方案”是删除sqlite数据库(幸运的是我使用fixtures来填充一个新的开发数据库)并执行一个新的syncdb并进行迁移。

确保使用fixtures,或使用dump命令备份数据库,这样你就可以干净利落......