2011-01-29 26 views
5
$ py manage.py migrate turkey 
Running migrations for turkey: 
- Migrating forwards to 0001_initial. 
> turkey:0001_initial 
! Error found during real run of migration! Aborting. 

! Since you have a database that does not support running 
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations. 

! You *might* be able to recover with: = DROP TABLE `turkey_demorecs` CASCADE; [] 

! The South developers regret this has happened, and would 
! like to gently persuade you to consider a slightly 
! easier-to-deal-with DBMS. 
! NOTE: The error which caused the migration to fail is further up. 

出於某種原因,當我嘗試它時,我得到了這個。 但我的其他設置在MyISAM中。Django的南方(遷移工具)是否適用於innodb?

Innodb爲什麼不起作用?

回答

1

是的,South確實支持InnoDB。您可以刪除「遷移」文件夾的內容,並重新運行schemamigration,遷移並在此發佈0001_initial文件的結果和內容? PS:確保先備份您的遷移文件夾或在源代碼管理中。

rm -fr app/migrations/* 
./manage.py schemamigration app --initial 
./manage.py migrate app 
3

又見https://code.djangoproject.com/wiki/AlterModelOnSyncDB

與MySQL的安裝程序,其默認的表存儲引擎是MyISAM和我想使用InnoDB(使用中發現的食譜工作時,我曾同一種錯誤的發生在我身上上面的鏈接,我們使用post_syncdb信號來觸發轉換代碼)。但是,當使用South創建新表時,他們首先使用MyISAM引擎創建,然後再進行轉換。我錯誤地認爲InnoDB表沒有按照他們應該做的那樣做,當時這些表實際上是MyISAM;因爲該表是由信號轉換,任何遷移錯誤將無法取消應用 - :

# add at the beginning of your migration 
if db.backend_name == 'mysql': 
    db.execute('SET storage_engine=INNODB') 

/

如果需要使用或創建InnoDB表,其中默認是MyISAM的,這跟來解決或者,如果你不介意的性能損失:

# add this to settings.py 
DATABASE_OPTIONS = { 
    "init_command": "SET storage_engine=INNODB", # XXX: performance hit... 
} 
+0

你確定嗎?我們甚至沒有原始錯誤。 – Tobu 2011-08-25 22:34:57

4

的InnoDB有外鍵,確保在做遷移的時候你是不是打破了數據庫模型的約束。 (見http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

MyISAM不具有約束的原生支持(雖然它似乎如果你選擇做做http://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html可以實現這一點)

因爲MyISAM數據沒有查收FK的關係,你沒有得到的錯誤。然而InnoDB正在做一個檢查,看起來你的遷移有問題。

1

你可以嘗試添加到您的第一個遷移:

if db.backend_name == 'mysql': 
    db.execute('SET foreign_key_checks=0') 

這將禁用外鍵檢查約束。

因爲它是一個會話變量,所以您不必將其重置爲1。

順便說一句,如果你在beggining在遷移方法的結尾設置爲0,返回1這是行不通的,因爲南部生成SQL和他們在一起,但是當他們返回執行它。