2012-02-10 24 views

Trả lời

2

Đ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

+0

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? –

+0

@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

+1

Ở đâ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'. –

3

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.

+2

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

+0

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. –

+0

Để 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

5

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 
1

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

Các vấn đề liên quan