2011-03-11 60 views
19

我遇到了一個問題,南遷移時創建新模型的數據庫表作爲INNODB,但當另一個開發人員運行自己的遷移時,將該表創建爲MYISAM。使用South和Django顯式設置MySQL表存儲引擎

這樣做的問題是我所有的其他表都是MYISAM,因此使用新表會導致許多外鍵約束錯誤。

我該如何明確確定表格是使用MYISAM創建的?

什麼可能導致在不同的環境中使用不同的存儲引擎創建表?

回答

22

要確保所有遷移正使用InnoDB總是做,你應該直接設置存儲引擎INNODB的數據庫定義,像這樣:

DATABASES = { 
    'default': { 
     ... 
     'OPTIONS' : { 'init_command' : 'SET storage_engine=INNODB', }, 
    } 

如果你正在使用MySQL 5.7.x及以上,

DATABASES = { 
    'default': { 
     ... 
     'OPTIONS' : { 'init_command' : 'SET default_storage_engine=INNODB', }, 
    } 

但是你應該知道它可以有一個performance hit。所以你可能只想在運行遷移時設置這個選項。

+0

爲了澄清,這正好在settings.py,而不是在遷移。 – 2011-03-11 15:14:27

+2

這正是我所期待的。謝謝。 爲了彌補你提到的性能問題,我在它周圍添加了一個條件。現在只有當我想修改數據庫(syncdb或修改)時纔會調用它。 'import sys' '如果在sys.argv中'遷移'或在sys.argv中'syncdb':' – 2011-03-14 08:04:33

+2

MyISAM的storage_engine設置是什麼?這是全部大寫還是混合大小寫,還是別的? – 2014-04-16 22:58:52

14

如果您使用南方,您可以設置STORAGE_ENGINE

django的< 1.2

# add to your settings file 
DATABASE_STORAGE_ENGINE = 'INNODB' # django < 1.2 

的django> = 1.2

# add to your settings file 
DATABASES = { 
    'default': { 
     ... 
     'STORAGE_ENGINE': 'INNODB' 
    } 
} 
+0

這是更好的答案(儘管存在拼寫錯誤 - 應爲「:」不是「=」,請參閱正確語法的鏈接),因爲它不會有前面提到的性能問題。存儲引擎只能在south進行遷移(例如創建表)時設置,而不能用於其他數據庫操作AIUI。 – 2012-06-08 10:58:47

+0

Daniel修復了這個問題:) – dnozay 2012-10-08 17:21:41

+0

注意那些使用較老的Django版本,但更新的MySQL的遺留項目的人 - 請注意Abhinav的評論,即storage_engine已從MySQL 5.7.x及更高版本中棄用。在Django設置文件中使用''DEFAULT_STORAGE_ENGINE'',而不是''STORAGE_ENGINE''。 – MisterRios 2016-09-14 19:36:53