使用django-south,是否可以在不应用所有先前迁移的情况下将表设置为最近的最新配置?
我们感兴趣的是使用第三方工具(django-activity-stream),但由于某些未知的原因(可能是关于特定字段的MySQL问题)而难以运行所有迁移 - 特别是迁移003,这会引发错误
_mysql_exceptions.OperationalError:(1170,“没有密钥长度的密钥规范中使用的BLOB / TEXT列'object_id'”) “ 我强烈怀疑避免迁移并直接进入当前架构将避免这种情况。
不需要向后迁移的能力,只需要立即将我们带到当前架构,而且我不想破解程序包来处理这个问题。我似乎无法建立命令,或者这是否可能?
配置:
南0.7.6,django 1.3.x,mysql 5.5.x,django-activity-stream 0.4.4
答案 0 :(得分:4)
由于actstream
处理其通用外键的方式,此错误即将发生。问题出现在MySql上,因为它看到没有任何文本字段
指定的长度。
可以通过使迁移0003成为无操作来修复此错误。
在actstream中的迁移0003_text_field_ids
,0004_char_field_ids
中更改以下内容:
0003_text_field_ids.py:
def forwards(self, orm)
,def backwards(self, orm)
中的所有内容,然后在两者中写下pass
。 TextField
更改为PositiveIntegerField
。0004_char_field_ids.py:
def backwards(self, orm)
中,将所有TextField
中的PositiveIntegerField
更改为db.altercolumns()
。这使得向前和向后使用传递使迁移0003成为noop,并使模型的定义使用PositiveIntegerFields
作为通用外键,因此它们保持与迁移0001离开它们的状态相同。这样做,迁移0004可以从PositiveIntegerFields
到varChars
。然后,此修补程序更改迁移0004,以便向后迁移更改为PositiveIntegerFields
而不是TextFields
。
这有望解决您的问题。
答案 1 :(得分:2)
我不认为问题是由迁移引起的,即使syncdb
也会给你相同的结果。
错误即将发生,因为MySQL只能索引BLOB或TEXT列的前N个字符。因此,您必须具有要尝试作为主键或索引的字段/列类型的TEXT或BLOB。
对于没有长度值的完整BLOB或TEXT ,MySQL将无法保证列的唯一性,因为它具有可变和动态大小。因此,当使用BLOB或TEXT类型作为索引时,必须提供N的值,以便MySQL可以确定密钥长度。
尝试解决此问题,然后尝试应用迁移,它应该可以很好地工作。 是的,你可以应用任何迁移和跳过旧的迁移,但我建议不要这样做,因为这不应该如何使用南。
希望我能说清楚一些事情。