我把我的模型从
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,因此迁移脚本是由south创建的)
# 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)上工作。
另一种选择可能是更改脚本并删除列,并使其成为列,而不是更改它...然而,我还有很多的迁移……我认为在旧的迁移中搞乱有点棘手……我试着用一次尝试接球来接住它。
也可能这个脚本是使用较老的south版本制作的……在较新的版本中,索引在更改列时也会被重命名...在旧版本中它不是..。
我使用的是south 0.7.6 (当前的最新版本)。
有什么建议吗?
发布于 2013-07-23 09:44:47
@Mariodev很抱歉让你失望,我没有找到任何解决方案。
因为南方开发社区并不认为sqlite是django的一个真正的数据库选项。看起来在不久的将来没有任何解决方案。也许它比这里所说的更复杂,我认为这也与在staed的开发服务器(runserver)上运行它有关。
在我的例子中,sqlite数据库就是我的开发和测试数据库(生产环境在mySQL上运行)
在mySql中未出现问题
因此,我的“解决方案”是删除sqlite数据库(幸运的是,我使用fixture填充一个新的开发数据库),然后执行新的syncdb和迁移。
确保使用fixture,或者使用dump命令备份数据库,这样您就可以从头开始……
发布于 2013-07-18 13:41:48
你可能已经弄明白了,如果是这样的话,你能把你的解决方案贴出来吗?
我自己也有同样的问题。我通过删除索引创建行解决了这个问题。在生产环境中迁移成功(mysql)。
环顾一下源代码,似乎修改操作已经自动为fk创建了索引,所以我猜create_index是不必要的。
https://stackoverflow.com/questions/14477477
复制相似问题