Jeg tror ikke, du kan ændre lagringsmotorer på en tabel-for-tabel basis, men du kan gøre det på en database-for-database basis. Dette betyder selvfølgelig, at InnoDB-fremmednøglebegrænsninger for eksempel ikke kan gælde for fremmednøgler til MyISAM-tabeller.
Så du skal erklære to "databaser", som meget vel kan være på den samme server:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#...
}
'innodb': {
'ENGINE': 'django.db.backends.mysql',
#...
'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
}
}
Og du skal blot anvende using('innodb')
til forespørgselssæt til tabeller i InnoDB land.
Hvad angår UTF-8, tror jeg igen, at du skal gøre dette på databaseniveau. Jeg tror ikke syncdb
opretter databasen for dig, kun tabellerne. Du bør alligevel oprette databasen manuelt, så du kan have privilegier indstillet lige før du kører syncdb
. Kommandoen til oprettelse af databasen, du ønsker, er:
CREATE DATABASE django CHARACTER SET utf8;
Når det er sagt, anbefaler jeg normalt, at folk opretter to django-brugere i databasen:en til databaseskemaarbejde ("admin") og en til alt andet (med forskellige adgangskoder):
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;
(Bemærk, at dette skal gøres for hver database.)
For at dette skal virke, skal du ændre manage.py
:
import sys
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
os.environ['DJANGO_ACCESS'] = "ADMIN"
Derefter i din settings.py
, brug miljøvariablen til at vælge de rigtige indstillinger. Sørg for, at webstedsbrugeren (dvs. ikke-admin) er standardbrugeren.
(Derudover gemmer jeg ikke databaseopsætningen, SECRET_KEY
, eller noget andet følsomt i settings.py
fordi mit Django-projekt er gemt i Mercurial; Jeg har settings.py
træk alt det ind fra en ekstern fil, som kun er tilgængelig for Djangos bruger og serveradministratorerne. Jeg vil efterlade "hvordan" som en øvelse til læseren... fordi jeg detaljerede noget af det i svar på andres spørgsmål, og jeg er for doven til at slå det op lige nu.)