【问题标题】:Django south error on CREATE INDEX after alter_column (field change)alter_column 后 CREATE INDEX 上的 Django south 错误(字段更改)
【发布时间】:2013-01-06 19:12:21
【问题描述】:

我改变了我的模型

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

现在我可以删除创建索引命令,但我不确定它是否可以在生产服务器 (mySql) 上运行。

另一种选择可能是更改脚本并删除列,并使其而不是更改它... 但是,我还有很多迁移......我认为在旧迁移中搞砸有点棘手...... 我试着用 try catch 来捕捉它......

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

我正在使用南 0.7.6(当前最新)。

有什么建议吗?

【问题讨论】:

    标签: django django-south migrate


    【解决方案1】:

    您可能已经想通了,如果可以,请您发布您的解决方案吗?

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

    看了下源码,altering操作好像已经自动为fk创建索引了,所以我想create_index是没有必要的。

    【讨论】:

      【解决方案2】:

      @Mariodev 很抱歉让您失望了,我没有找到任何解决方案。

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

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

      这个问题在mySql中没有出现

      所以我的“解决方案”是删除 sqlite 数据库(幸运的是,我使用固定装置来填充新的开发数据库)并执行新的同步数据库并迁移。

      确保您使用固定装置,或使用转储命令备份数据库,这样您就可以重新开始...

      【讨论】:

        猜你喜欢
        • 2013-04-19
        • 2014-05-01
        • 1970-01-01
        • 2014-05-16
        • 2012-08-06
        • 2011-04-23
        • 1970-01-01
        • 2012-05-19
        • 2015-03-02
        相关资源
        最近更新 更多