2012-08-16 9 views
7

使用django-south,是否可以僅將表設置爲最近的最新配置而不應用所有先前的遷移?無法安裝django活動流數據庫表

我們有興趣使用第三方工具(django-activity-stream),但由於某些未知的原因(可能涉及特定領域的MySQL問題)運行所有遷移時遇到困難 - 特別是遷移003,這會引發錯誤

_mysql_exceptions.OperationalError: (1170, "BLOB/TEXT column 'object_id' used in key specification without a key length") " I strongly suspect that avoiding the migrations and going straight to the current schema will avoid this.

向後遷移的能力不是必需的,只是需要得到我們目前的模式,現在,我不想砍包來處理這個問題。我似乎無法建立命令,或者這是否有可能?

配置:

南0.7.6,Django的1.3.x版中,MySQL的5.5.x,Django的活動流0.4.4

+0

我看到Django上1.4相同的錯誤運行遷移 – 2012-09-07 04:30:58

+1

非常抱歉,如果我錯了,因爲沒有時間去考試的時候,但你爲什麼不能只是做manage.py執行syncdb --all,然後再管理。 py migrate --fake? – 2012-09-12 07:06:40

+0

注意:如果在以前的工作之前在以前的工作中以某種錯誤的狀態創建了應用程序,則需要從數據庫中手動刪除該應用程序的表。 – 2012-09-12 07:16:11

回答

4

由於actstream處理其通用外鍵的方式,此錯誤即將到來。 MySql出現問題是因爲它看到的文本字段沒有指定任何長度。

可以通過將遷移0003設爲無操作來解決此錯誤。

變化遷移0003_text_field_ids0004_char_field_ids在actstream下面的事情:

0003_text_field_ids.py:

  1. 刪除一切def forwards(self, orm)def backwards(self, orm)和只寫在兩個pass
  2. 更改TextFieldPositiveIntegerField

0004_char_field_ids.py:

  1. def backwards(self, orm),在所有db.altercolumns()改變TextFieldPositiveIntegerField

這使得遷移0003使用通行證向前和向後一個空操作,使得模型的定義使用PositiveIntegerFields爲通用外鍵,所以他們保持相同的狀態遷移0001離開了他們。這樣做,遷移0004可以從PositiveIntegerFieldsvarChars。然後修復更改遷移0004,以便向後遷移更改爲PositiveIntegerFields而不是TextFields

這應該有希望解決您的問題。

2

我不認爲這個問題是由移民引起的,甚至是syncdb會給你相同的結果。

錯誤即將到來是因爲MySQL只能索引BLOB或TEXT列的前N個字符。所以你必須有一個字段/列類型的TEXT或BLOB,你試圖作爲主鍵或索引。

對於完整的BLOB或文本沒有長度值,MySQL將無法保證列的唯一性,因爲它的變量和動態大小。因此,當使用BLOB或TEXT類型作爲索引時,必須提供N的值,以便MySQL可以確定密鑰長度。

嘗試解決此問題,然後嘗試應用遷移,它應該很好地工作。 是的,你可以申請任何遷移和跳過舊的,但我會建議不要這樣做,因爲這不是南方應該如何使用。

希望我把事情弄清楚了一點。