我改变了我的模型
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(目前的最新版本)。
有什么建议吗?
答案 0 :(得分:0)
你可能已经想出来了,如果是的话,你可以发布你的解决方案吗?
我自己也有同样的问题。我通过删除索引创建行来解决它。 迁移在生产中成功(mysql)。
在查看源代码后,似乎改变操作已经自动为fk创建索引,所以我猜create_index是不必要的。
答案 1 :(得分:0)
@Mariodev 很抱歉让你失望,我没有找到任何解决办法。
由于sqlite不被南方开发社区视为django的真正数据库选项......在不久的将来看起来没有任何解决方案。 也许它在这里说的有点复杂,我认为它也与在开发服务器(runserver)上运行它的东西有关。
在我的情况下,sqlite数据库只是我的开发和测试数据库(生产在mySQL上运行)
mySql中没有出现问题
所以我的“解决方案”是删除sqlite数据库(幸运的是我使用fixtures来填充一个新的开发数据库)并执行一个新的syncdb并进行迁移。
确保使用fixtures,或使用dump命令备份数据库,这样你就可以干净利落......