InnoDB的反正我有可以將一個完整填充的MyISAM數據庫InnoDB的(的方式,將創建所有的外鍵約束上,同樣的方式,如果我從跑了執行syncdb命令時,它會開始)?將現有的MyISAM數據庫的Django
回答
這真的和Django無關。這完全是一個MySQL的東西,直接從他們這裏直接找到這類文檔:http://dev.mysql.com/doc/refman/5.5/en/converting-tables-to-innodb.html
使用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。
您可以使用./manage.py截斷所有表格sqlflush | ./manage.py dbshell – frog32 2012-11-05 09:21:19
django文檔說創建表時刪除了init_command,因爲它向每個數據庫連接添加了一個SQL查詢。相反,更改MySQL配置中的默認表類型。 – 2013-10-17 09:16:16
任何人來這裏複製/粘貼代碼:你可能試過這個,並且它在第1行出現'ERROR 1064(42000)'錯誤。這是因爲運行'python manage.py sqlflush'時有初始警告。爲了規避它:'python manage.py sqlflush> flushdump.txt',刪除最初的警告,保存,然後'python manage.py dbshell
這可能幫助:
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
我類似的情況,我不知道我的託管服務提供商有這樣一箇舊版本的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.py,python 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中
- 1. Django的:現有的數據庫外鍵
- 2. Phpbb3.1 MyIsam數據庫損壞
- 3. 轉換的MyISAM InnoDB的數據庫
- 4. 如何將NullableBooleanField添加到現有的Django數據庫?
- 5. 將現有的數據庫適配到Django應用程序
- 6. Django的編輯和更新現有的數據在數據庫
- 7. Prestashop的MyISAM或InnoDB數據庫?
- 8. 將數據導入帶有現有數據的Django模型?
- 9. 在Django中使用現有數據庫
- 10. 優化MySQL數據庫 - 的MyISAM數據庫
- 11. 將數據複製到myisam的innodb
- 12. 將現有的數據庫轉換爲數據庫項目
- 13. 將數據添加到MySQL數據庫中的現有數據
- 14. 將MyISAM數據庫與InnoDB和MyISAM表遷移到新服務器
- 15. 具有現有數據庫的Django模型
- 16. django添加新的ManyToManyField到現有的數據庫
- 17. Django的錯誤現有的MySQL數據庫
- 18. 如何選擇mysql數據庫引擎? InnoDB的或MyISAM數據
- 19. MySQL的MyISAM數據更新
- 20. php數據庫myisam密碼加密
- 21. mysql數據庫innodb myisam性能
- 22. 生成數據庫MyISAM Doctrine 2
- 23. 現有數據庫
- 24. Django的:有效的數據庫搜索
- 25. 將數據導入到neo4j中的現有數據庫中
- 26. 獲取和將數據添加到現有的SQLite數據庫
- 27. 將主數據服務應用到現有的SQL數據庫
- 28. 從現有的MongoDB數據庫創建Django模型
- 29. django datadump如何覆蓋數據庫中的現有記錄?
- 30. Django重複數據庫中的現有記錄
是不是真的?我的意思是,MyISAM表沒有存儲在其定義中的外鍵約束。另一方面,Django擁有關於表關係的信息,不是嗎?也許OP在詢問一種轉換表的方法,同時添加Django中定義的FK(與關係對應)? – 2012-02-10 22:47:35
@ypercube - 你說的對,我不知道爲什麼Chris認爲它不適合Django .. – Ohad 2012-02-11 06:06:11
Chris在評論中說他不適合Django嗎?他只是說遷移表與Django無關,這是事實。按照他的指示,如果FK約束不存在,你可以用'manage.py sqlindexes'來獲得它們。 – 2012-02-11 10:04:26