2012-02-10 61 views
7

InnoDB的反正我有可以將一個完整填充的MyISAM數據庫InnoDB的(的方式,將創建所有的外鍵約束上,同樣的方式,如果我從跑了執行syncdb命令時,它會開始)?將現有的MyISAM數據庫的Django

回答

2

這真的和Django無關。這完全是一個MySQL的東西,直接從他們這裏直接找到這類文檔:http://dev.mysql.com/doc/refman/5.5/en/converting-tables-to-innodb.html

+0

是不是真的?我的意思是,MyISAM表沒有存儲在其定義中的外鍵約束。另一方面,Django擁有關於表關係的信息,不是嗎?也許OP在詢問一種轉換表的方法,同時添加Django中定義的FK(與關係對應)? – 2012-02-10 22:47:35

+0

@ypercube - 你說的對,我不知道爲什麼Chris認爲它不適合Django .. – Ohad 2012-02-11 06:06:11

+1

Chris在評論中說他不適合Django嗎?他只是說遷移表與Django無關,這是事實。按照他的指示,如果FK約束不存在,你可以用'manage.py sqlindexes'來獲得它們。 – 2012-02-11 10:04:26

3

使用Django將MyISAM轉換爲InnoDB。

鑑於舊的數據庫中的MyISAM。

轉儲舊數據庫裏的數據,以JSON:

$ python manage.py dumpdata contenttypes --indent=4 --natural > contenttype.json 
$ python manage.py dumpdata --exclude contenttypes --indent=4 --natural > everything_else.json 

刪除舊的數據庫,並重新創建它。

在你的settings.py添加InnoDB的設置是這樣的:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'STORAGE_ENGINE': 'InnoDB', 
     'NAME': 'yourdbname', 
     'USER': '', 
     'PASSWORD': '', 
     'HOST': '', 
     'PORT': '', 
     'OPTIONS': { 
      'init_command': 'SET storage_engine=InnoDB', # better to set this in your database config, otherwise django has to do a query everytime 
     } 
    } 
} 

創建表(Django的還增加了關係) 確保你不添加一個管理員用戶:

$ python manage.py syncdb --migrate 

現在要清空所有的舊錶:

$ python manage.py sqlflush | ./manage.py dbshell 

現在你可以加載NE w數據如下:

$ python manage.py loaddata contenttype.json 
$ python manage.py loaddata everything_else.json 

你走了。 我爲此使用了Django == 1.4。

+2

您可以使用./manage.py截斷所有表格sqlflush | ./manage.py dbshel​​l – frog32 2012-11-05 09:21:19

+0

django文檔說創建表時刪除了init_command,因爲它向每個數據庫連接添加了一個SQL查詢。相反,更改MySQL配置中的默認表類型。 – 2013-10-17 09:16:16

+0

任何人來這裏複製/粘貼代碼:你可能試過這個,並且它在第1行出現'ERROR 1064(42000)'錯誤。這是因爲運行'python manage.py sqlflush'時有初始警告。爲了規避它:'python manage.py sqlflush> flushdump.txt',刪除最初的警告,保存,然後'python manage.py dbshel​​l 2016-05-06 17:12:15

5

這可能幫助:

from django.core.management.base import BaseCommand 
from django.db import connections 


class Command(BaseCommand): 

    def handle(self, database="default", *args, **options): 

     cursor = connections[database].cursor() 

     cursor.execute("SHOW TABLE STATUS") 

     for row in cursor.fetchall(): 
      if row[1] != "InnoDB": 
       print "Converting %s" % row[0], 
       print cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0]) 

是添加到您的應用程序文件夾下的管理/命令/然後您可以將所有錶轉換與manage.py命令:

python manage.py convert_to_innodb 
1

我類似的情況,我不知道我的託管服務提供商有這樣一箇舊版本的MySQL,它仍然默認爲MyISAM的,但我已經建立了基本的Django表。

這被張貼在原來的問題後約2個月:Convert Legacy Django MySQL DBS from MyISAM to InnoDB

That and leech/Trey的回答描述了ALTER TABLE ___ ENGINE = INNODB命令,它可以轉換MySQL中的表格,但問題是即使轉換了表格,它們也沒有外鍵約束已成立,如果表已經INNODB擺在首位。

我發現,在django-admin.py and manage.pypython manage.py sqlall appname「打印給定應用程序名稱的CREATE TABLE和初始數據SQL語句」。

我查看了settings.py中的INSTALLED_APPS,並最終運行了類似於python manage.py sqlall admin auth contenttypes sessions sites messages staticfiles(INSTALLED_APPS中的每個django.contrib.appname一個)。這表明最初的CREATE TABLE語句,索引和外鍵約束:

ALTER TABLE `django_admin_log` ADD CONSTRAINT `content_type_id_refs_id_288599e6` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`); 
ALTER TABLE `django_admin_log` ADD CONSTRAINT `user_id_refs_id_c8665aa` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`); 
ALTER TABLE `auth_permission` ADD CONSTRAINT `content_type_id_refs_id_728de91f` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`); 
ALTER TABLE `auth_group_permissions` ADD CONSTRAINT `permission_id_refs_id_a7792de1` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`); 
ALTER TABLE `auth_group_permissions` ADD CONSTRAINT `group_id_refs_id_3cea63fe` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`); 
ALTER TABLE `auth_user_user_permissions` ADD CONSTRAINT `permission_id_refs_id_67e79cb` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`); 
ALTER TABLE `auth_user_groups` ADD CONSTRAINT `group_id_refs_id_f0ee9890` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`); 
ALTER TABLE `auth_user_user_permissions` ADD CONSTRAINT `user_id_refs_id_f2045483` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`); 
ALTER TABLE `auth_user_groups` ADD CONSTRAINT `user_id_refs_id_831107f1` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`); 
ALTER TABLE `auth_message` ADD CONSTRAINT `user_id_refs_id_9af0b65a` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`); 

所有錶轉換爲ENGINE = INNODB後,我跑了上面的外鍵約束,並認爲我應該有相同的狀態,因爲它的數據庫如果我的數據庫首先默認創建INNODB表,那將會是這樣。

另外,作爲邁克爾·範·德Waeter在他的回答中提到,如果你想要的任何新表的Django創建在默認情況下是InnoDB,你應該添加'OPTIONS': {"init_command": "SET storage_engine=INNODB",}到數據庫字典settings.py中