Nie sądzę, że można zmieniać silniki pamięci masowej na podstawie tabeli po tabeli, ale można to zrobić na podstawie bazy danych po bazie danych. To oczywiście oznacza, że na przykład ograniczenia kluczy obcych InnoDB nie mogą mieć zastosowania do kluczy obcych w tabelach MyISAM.
Musisz więc zadeklarować dwie „bazy danych”, które równie dobrze mogą znajdować się na tym samym serwerze:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#...
}
'innodb': {
'ENGINE': 'django.db.backends.mysql',
#...
'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
}
}
Musisz tylko zastosować using('innodb')
do zestawów zapytań dla tabel w obszarze InnoDB.
Jeśli chodzi o UTF-8, znowu myślę, że musisz to zrobić na poziomie bazy danych. Nie sądzę, aby syncdb
tworzy dla Ciebie bazę danych, tylko tabele. Mimo to powinieneś utworzyć bazę danych ręcznie, aby mieć uprawnienia ustawione tuż przed uruchomieniem syncdb
. Wybrane polecenie tworzenia bazy danych to:
CREATE DATABASE django CHARACTER SET utf8;
To powiedziawszy, zwykle zalecam, aby ludzie tworzyli dwóch użytkowników django w bazie danych:jednego do pracy ze schematem bazy danych ("admin") i jednego do wszystkiego innego (z różnymi hasłami):
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;
(Pamiętaj, że należy to zrobić dla każdej bazy danych.)
Aby to zadziałało, musisz zmodyfikować manage.py
:
import sys
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
os.environ['DJANGO_ACCESS'] = "ADMIN"
Następnie w swoim settings.py
, użyj zmiennej środowiskowej, aby wybrać odpowiednie ustawienia. Upewnij się, że użytkownik witryny (tj. użytkownik niebędący administratorem) jest domyślny.
(Dodatkowo nie przechowuję ustawień bazy danych, SECRET_KEY
lub cokolwiek innego wrażliwego w settings.py
ponieważ mój projekt Django jest przechowywany w Mercurial; Mam settings.py
ściągnij to wszystko z zewnętrznego pliku dostępnego tylko dla użytkownika Django i administratorów serwera. Zostawię „jak” jako ćwiczenie dla czytelnika… ponieważ wyszczególniłem niektóre z nich w odpowiedziach na pytania innych i jestem zbyt leniwy, aby to teraz sprawdzić.)