Có cách nào tôi có thể chuyển đổi cơ sở dữ liệu MyISAM được điền đầy đủ sang InnoDB (theo cách sẽ tạo ra tất cả các ràng buộc khóa ngoại, tương tự như vậy nếu tôi chạy lệnh syncdb từ bắt đầu)?Chuyển đổi cơ sở dữ liệu MyISAM hiện có sang InnoDB bằng Django
Trả lời
Điều này thực sự không liên quan gì đến Django. Nó hoàn toàn là một điều MySQL, và có tài liệu về chỉ loại điều này trực tiếp từ chúng: http://dev.mysql.com/doc/refman/5.5/en/converting-tables-to-innodb.html
Chuyển MyISAM thành InnoDB bằng Django.
Với cơ sở dữ liệu cũ nằm trong MyISAM.
Dump dữ liệu của cơ sở dữ liệu cũ sang JSON với:
$ python manage.py dumpdata contenttypes --indent=4 --natural > contenttype.json
$ python manage.py dumpdata --exclude contenttypes --indent=4 --natural > everything_else.json
Xóa cơ sở dữ liệu cũ, và tạo ra nó một lần nữa.
Thêm thiết lập InnoDB trong settings.py của bạn như thế này:
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
}
}
}
Tạo bảng (django cũng cho biết thêm các mối quan hệ) Hãy chắc chắn rằng bạn không thêm một tài khoản admin:
$ python manage.py syncdb --migrate
Bây giờ bạn muốn trống tất cả các bảng cũ:
$ python manage.py sqlflush | ./manage.py dbshell
Bây giờ bạn có thể tải ne w dữ liệu vào cơ sở dữ liệu như vậy:
$ python manage.py loaddata contenttype.json
$ python manage.py loaddata everything_else.json
Có bạn đi. Tôi đã sử dụng Django == 1.4 cho việc này.
bạn có thể cắt ngắn tất cả các bảng của bạn bằng cách sử dụng ./manage.py sqlflush | ./manage.py dbshell – frog32
Tài liệu django nói để xóa init_command khi bảng của bạn đã được tạo, vì nó thêm truy vấn SQL vào mọi kết nối cơ sở dữ liệu. Thay vào đó, thay đổi kiểu bảng mặc định trong cấu hình MySQL của bạn. –
Để bất cứ ai đến đây để sao chép/dán mã: bạn có thể đã thử điều này và nó đã đưa ra một lỗi '" ERROR 1064 (42000) tại dòng 1 "'. Đó là vì đã có cảnh báo ban đầu khi chạy 'python manage.py sqlflush'. Để phá vỡ nó: 'python manage.py sqlflush> flushdump.txt', xóa các cảnh báo ban đầu, lưu, sau đó' python manage.py dbshell
này có thể giúp:
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])
Thêm vào đó để ứng dụng của bạn dưới các thư mục quản lý/lệnh/Sau đó, bạn có thể chuyển đổi tất cả các bảng của bạn với một lệnh manage.py:
python manage.py convert_to_innodb
tôi đã một tình huống tương tự mà tôi đã không nhận ra nhà cung cấp lưu trữ của tôi đã có một phiên bản MySQL cũ mà nó vẫn mặc định để MyISAM, nhưng tôi đã thiết lập các bảng Django cơ bản.
Điều này đã được đăng khoảng 2 tháng sau câu hỏi gốc: Convert Legacy Django MySQL DBS from MyISAM to InnoDB.
Câu trả lời của Leech/Trey mô tả lệnh ALTER TABLE ___ ENGINE = INNODB chuyển đổi bảng trong MySQL, nhưng vấn đề là mặc dù các bảng được chuyển đổi, chúng không có ràng buộc khóa ngoài được thiết lập nếu các bảng đã được INNODB ở nơi đầu tiên.
Tôi tìm thấy, trên django-admin.py and manage.py, rằng python manage.py sqlall appname
"in câu lệnh CREATE TABLE và câu lệnh SQL dữ liệu ban đầu cho (các) tên ứng dụng nhất định".
Tôi đã xem INSTALLED_APPS trong settings.py và kết thúc chạy một cái gì đó như python manage.py sqlall admin auth contenttypes sessions sites messages staticfiles
(một cho mỗi django.contrib.appname trong INSTALLED_APPS).Điều đó cho thấy ban đầu các câu lệnh CREATE TABLE, chỉ số và ràng buộc khoá ngoại:
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`);
Sau khi chuyển đổi tất cả các bảng để ENGINE = InnoDB Tôi chạy các ràng buộc khoá ngoại trên và tin rằng tôi cần phải có cơ sở dữ liệu trong tình trạng giống như nó sẽ có được nếu cơ sở dữ liệu của tôi đã mặc định để tạo bảng INNODB ở nơi đầu tiên.
Ngẫu nhiên, như Michael van de Waeter đề cập trong câu trả lời của mình, nếu bạn muốn bất kỳ bảng mới Django tạo được InnoDB theo mặc định, bạn nên thêm 'OPTIONS': {"init_command": "SET storage_engine=INNODB",}
đến cơ sở dữ liệu Dict trong settings.py
- 1. MySql - Chuyển đổi InnoDB sang Cơ sở dữ liệu lưu trữ MyISAM
- 2. Chuyển đổi XML sang cơ sở dữ liệu bằng Java
- 3. Cơ sở dữ liệu MySQL engine: MyISAM cho information_schema nhưng InnoDB cho các cơ sở dữ liệu khác
- 4. Cách chuyển đổi cơ sở dữ liệu Visual Foxpro sang cơ sở dữ liệu SQL Server
- 5. Java, cách thay đổi cơ sở dữ liệu hiện tại sang cơ sở dữ liệu khác?
- 6. Chuyển đổi tệp .db cơ sở dữ liệu sang .csv
- 7. Chuyển dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác
- 8. Di chuyển cơ sở dữ liệu MySQL phát triển sang cơ sở dữ liệu sản xuất
- 9. Di chuyển cơ sở dữ liệu MySQL InnoDB để tách ổ đĩa
- 10. cách chuyển đổi bảng cơ sở dữ liệu sqlite hiện tại sang fts3?
- 11. Chuyển đổi tệp BibTex sang mục cơ sở dữ liệu bằng cách sử dụng Python
- 12. Chuyển đổi từ cơ sở dữ liệu/Excel/CSV sang đồ đạc dữ liệu YAML?
- 13. Cơ sở dữ liệu MySQL InnoDB khôi phục
- 14. Thay đổi bảng cơ sở dữ liệu ở Django
- 15. Tạo cơ sở dữ liệu innodb trong mysql
- 16. Meteor cách thực hiện di chuyển cơ sở dữ liệu?
- 17. Cách di chuyển dữ liệu và cài đặt từ cơ sở dữ liệu này sang cơ sở dữ liệu khác?
- 18. Chuyển đổi cơ sở dữ liệu Postgres thông thường thành cơ sở dữ liệu không gian
- 19. Cách an toàn nhất để chuyển đổi bảng với InnoDB thành MyISAM là gì?
- 20. Hiệu suất khác biệt giữa Innodb và Myisam trong Mysql
- 21. Làm cách nào để di chuyển Sơ đồ cơ sở dữ liệu SQL Server sang cơ sở dữ liệu khác?
- 22. Cách thay thế tệp cơ sở dữ liệu sqlite hiện có bằng tệp cơ sở dữ liệu mới trong android
- 23. mysql innodb vs myisam chèn
- 24. Sao chép dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác trong Oracle
- 25. Cách tốt nhất để chuyển đổi cơ sở dữ liệu mysql thành cơ sở dữ liệu sqlite là gì?
- 26. Sao chép bảng từ một cơ sở dữ liệu sang một cơ sở dữ liệu khác
- 27. Long Blob innodb hoặc MyISAM
- 28. Cập nhật nguyên tử MySQL trong InnoDB vs MyISAM
- 29. Khi MyISAM tốt hơn InnoDB?
- 30. Di chuyển các thay đổi cơ sở dữ liệu từ phát triển sang sống
Là nó thực sự? Ý tôi là, các bảng MyISAM không có ràng buộc khóa ngoại nào được lưu trữ trong các định nghĩa của chúng. Django mặt khác, có thông tin về mối quan hệ bảng, phải không? Có lẽ OP đang hỏi về một cách để chuyển đổi các bảng và đồng thời thêm các FK (tương ứng với các mối quan hệ) được định nghĩa trong Django? –
@ypercube - Bạn nói đúng, tôi không biết tại sao Chris nghĩ nó không phù hợp với Django .. – Ohad
Ở đâu trong bình luận của Chris anh ấy nói nó không phù hợp với Django? Ông chỉ nói rằng di chuyển các bảng không có gì để làm với Django, đó là sự thật. Thực hiện theo các hướng dẫn của mình và nếu các ràng buộc FK không có sẵn thì bạn có thể nhận chúng với 'manage.py sqlindexes'. –