8

Tạo các bảng của tôi từ models.py. Tôi donno làm thế nào để làm 2 việc -Django đặt Công cụ lưu trữ & Bộ ký tự mặc định

  1. tôi muốn chỉ định MySQL để tạo ra một số các bảng của tôi như InnoDB & một số như MyISAM. Tôi phải làm nó như thế nào?
  2. Ngoài ra, tôi muốn chỉ định các bảng của mình DEFAULT CHARSETutf8. Tôi phải làm nó như thế nào?

Đây là những gì tôi thấy khi chạy syncdb -

... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

tôi sử dụng Ubuntu 10.04, Django 1.2.X, MySQL 5.1.X

CẬP NHẬT: Tôi nghĩ Đây có thể là cài đặt mặc định của MySQL & Tôi đã thay đổi my.cnf nơi tôi đã thêm default-character-set = utf8. Nhưng không sử dụng.

Trả lời

17

Tôi không nghĩ bạn có thể thay đổi công cụ lưu trữ trên cơ sở từng bảng, nhưng bạn có thể thực hiện nó trên cơ sở dữ liệu theo từng cơ sở dữ liệu. Điều này, tất nhiên, có nghĩa là các ràng buộc khóa ngoài của InnoDB, chẳng hạn, không thể áp dụng cho các khóa ngoài cho các bảng MyISAM.

Vì vậy, bạn cần phải khai báo hai "cơ sở dữ liệu", mà rất có thể là trên cùng một máy chủ:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     #... 
    } 
    'innodb': { 
     'ENGINE': 'django.db.backends.mysql', 
     #... 
     'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' } 
    } 
} 

Và bạn sẽ chỉ cần phải áp dụng using('innodb') để queryset cho bảng trong đất InnoDB.

Đối với UTF-8, một lần nữa, tôi nghĩ bạn cần thực hiện việc này ở cấp cơ sở dữ liệu. Tôi không nghĩ rằng syncdb tạo cơ sở dữ liệu cho bạn, chỉ là các bảng. Tuy nhiên, bạn nên tạo cơ sở dữ liệu theo cách thủ công, vì vậy bạn có thể đặt các đặc quyền ngay trước khi chạy syncdb. Lệnh tạo cơ sở dữ liệu bạn muốn là:

CREATE DATABASE django CHARACTER SET utf8; 

Điều đó nói rằng, tôi thường khuyên mọi người tạo ra hai người dùng django trong cơ sở dữ liệu: một cho công việc giản đồ cơ sở dữ liệu ("admin") và một cho mọi thứ khác (với mật khẩu khác nhau):

CREATE DATABASE django CHARACTER SET utf8; 
CREATE USER 'django_site'@'localhost' IDENTIFIED BY 'password'; 
GRANT SELECT, INSERT, UPDATE, DELETE ON django.* TO django_site; 
CREATE USER 'django_admin'@'localhost' IDENTIFIED BY 'password'; 
GRANT SELECT, INSERT, UPDATE, DELETE ON django.* TO django_admin; 
GRANT CREATE, DROP, ALTER, INDEX, LOCK TABLES ON django.* TO django_admin; 
FLUSH PRIVILEGES; 

(Lưu ý rằng điều này cần phải được thực hiện đối với từng cơ sở dữ liệu)

để làm việc này, bạn cần phải sửa đổi manage.py:.

import sys 
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]: 
    os.environ['DJANGO_ACCESS'] = "ADMIN" 

Sau đó, trong settings.py, hãy sử dụng biến môi trường để chọn cài đặt phù hợp. Đảm bảo rằng người dùng trang web (nghĩa là không phải quản trị viên) là mặc định.

(Ngoài ra, tôi không lưu trữ thiết lập cơ sở dữ liệu, SECRET_KEY hoặc bất kỳ điều gì khác nhạy cảm trong settings.py vì dự án Django của tôi được lưu trữ trong Mercurial; Tôi sẽ để lại "như thế nào" như một bài tập cho người đọc ... bởi vì tôi đã chi tiết một số câu trả lời cho câu hỏi của người khác, và tôi quá lười biếng để tìm kiếm nó ngay bây giờ.)

+3

Vâng, bạn * có thể * trộn InnoDB và MyISAM trong một cơ sở dữ liệu. Tôi đã học được nó một cách khó khăn khi một số chìa khóa nước ngoài của tôi không được thi hành và một số trong số đó là. Vì vậy, bạn nên đặt loại bảng mặc định của MySQL thành InnoDB. Nếu không, ngay cả một bãi chứa và tải lại tiếp theo có thể thay đổi loại bảng, nếu bạn quên đổ thông tin này. –

+0

Bạn có thể vui lòng giải thích những gì 'sử dụng ('innodb')' có nghĩa là và nơi để thêm nó? –

+0

Một 'QuerySet', theo mặc định, sử dụng cơ sở dữ liệu được chỉ định trong' settings.DATABASES ['default'] '. Để sử dụng một cơ sở dữ liệu khác (ví dụ như một cái tên có tên ''innodb'' trong ví dụ trên), bạn cần gọi hàm' using' trên 'QuerySet' (ví dụ' Foo.objects.filter (...). ('innodb') '). –

2
CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `firstname` varchar(32) NOT NULL, 
    `lastname` varchar(32) NOT NULL, 
    `gender` varchar(6) NOT NULL, 
    `email` varchar(32) NOT NULL, 
    `username` varchar(32) NOT NULL, 
    `password` varchar(32) NOT NULL, 
    `created` datetime NOT NULL, 
    `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ; 
+0

cảm ơn mã thô. –

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