更改列后创建索引时出现Django south错误(字段更改)

更改列后创建索引时出现Django south错误(字段更改),django,django-south,migrate,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) 到 我用南方移民。(使用--auto,因此迁移脚本由south生成) 现在,在创建一个

我改变了我的模型

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)

我用南方移民。(使用--auto,因此迁移脚本由south生成)

现在,在创建一个全新的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
现在我可以删除createindex命令,但我不确定它是否能在生产服务器(mySql)上工作

另一个选择可能是更改脚本并删除列,并使其成为一个列,而不是更改它。。。 然而,我有很多进一步的迁移。。。。我认为把旧的迁移搞得一团糟有点棘手。。。。。 我试着用试抓的方式抓住它

这也可能是因为这个脚本使用了较旧的南方版本。。。。在较新的版本中,索引在更改列时也被重命名。。。在旧版本中,它不是

我正在使用south 0.7.6(当前最新版本)


有什么建议吗?

你可能已经想好了,如果有,你能发布你的解决方案吗

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

查看源代码后,似乎更改操作已经自动为fk创建索引,因此我想创建索引是不必要的。

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

由于sqlite不被南方开发社区视为django的真正数据库选项。。。在不久的将来似乎没有任何解决办法。 也许这里说的更复杂一点,我认为这也和在开发服务器(runserver)上运行它有关

在我的例子中,sqlite数据库只是我的开发和测试数据库(生产运行在mySQL上)

这个问题在mySql中不会出现

因此,我的“解决方案”是删除sqlite数据库(幸运的是,我使用Fixture来填充一个新的开发数据库),并执行一个新的syncdb和迁移

确保您使用fixture,或者使用dump命令备份数据库,这样您就可以有一个干净的开始

    # 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'])
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