我遇到了一個問題,南遷移時創建新模型的數據庫表作爲INNODB,但當另一個開發人員運行自己的遷移時,將該表創建爲MYISAM。使用South和Django顯式設置MySQL表存儲引擎
這樣做的問題是我所有的其他表都是MYISAM,因此使用新表會導致許多外鍵約束錯誤。
我該如何明確確定表格是使用MYISAM創建的?
什麼可能導致在不同的環境中使用不同的存儲引擎創建表?
我遇到了一個問題,南遷移時創建新模型的數據庫表作爲INNODB,但當另一個開發人員運行自己的遷移時,將該表創建爲MYISAM。使用South和Django顯式設置MySQL表存儲引擎
這樣做的問題是我所有的其他表都是MYISAM,因此使用新表會導致許多外鍵約束錯誤。
我該如何明確確定表格是使用MYISAM創建的?
什麼可能導致在不同的環境中使用不同的存儲引擎創建表?
要確保所有遷移正使用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。所以你可能只想在運行遷移時設置這個選項。
如果您使用南方,您可以設置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'
}
}
這是更好的答案(儘管存在拼寫錯誤 - 應爲「:」不是「=」,請參閱正確語法的鏈接),因爲它不會有前面提到的性能問題。存儲引擎只能在south進行遷移(例如創建表)時設置,而不能用於其他數據庫操作AIUI。 – 2012-06-08 10:58:47
Daniel修復了這個問題:) – dnozay 2012-10-08 17:21:41
注意那些使用較老的Django版本,但更新的MySQL的遺留項目的人 - 請注意Abhinav的評論,即storage_engine已從MySQL 5.7.x及更高版本中棄用。在Django設置文件中使用''DEFAULT_STORAGE_ENGINE'',而不是''STORAGE_ENGINE''。 – MisterRios 2016-09-14 19:36:53
爲了澄清,這正好在settings.py,而不是在遷移。 – 2011-03-11 15:14:27
這正是我所期待的。謝謝。 爲了彌補你提到的性能問題,我在它周圍添加了一個條件。現在只有當我想修改數據庫(syncdb或修改)時纔會調用它。 'import sys' '如果在sys.argv中'遷移'或在sys.argv中'syncdb':' – 2011-03-14 08:04:33
MyISAM的storage_engine設置是什麼?這是全部大寫還是混合大小寫,還是別的? – 2014-04-16 22:58:52