Non penso che tu possa cambiare i motori di archiviazione tabella per tabella, ma puoi farlo database per database. Questo, ovviamente, significa che i vincoli di chiave esterna di InnoDB, ad esempio, non possono essere applicati alle chiavi esterne alle tabelle MyISAM.
Quindi devi dichiarare due "database", che potrebbero benissimo trovarsi sullo stesso server:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#...
}
'innodb': {
'ENGINE': 'django.db.backends.mysql',
#...
'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
}
}
E dovrai solo applicare using('innodb')
ai set di query per le tabelle nella terra di InnoDB.
Per quanto riguarda UTF-8, ancora una volta, penso che tu debba farlo a livello di database. Non credo syncdb
crea il database per te, solo le tabelle. Dovresti comunque creare il database manualmente, così puoi avere i privilegi impostati subito prima di eseguire syncdb
. Il comando di creazione del database che desideri è:
CREATE DATABASE django CHARACTER SET utf8;
Detto questo, di solito consiglio alle persone di creare due utenti django nel database:uno per il lavoro sullo schema del database ("admin") e uno per tutto il resto (con password diverse):
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;
(Nota che questo deve essere fatto per ogni database.)
Affinché funzioni, devi modificare manage.py
:
import sys
if len(sys.argv) >= 2 and sys.argv[1] in ["syncdb", "dbshell", "migrate"]:
os.environ['DJANGO_ACCESS'] = "ADMIN"
Quindi nel tuo settings.py
, usa la variabile d'ambiente per scegliere le impostazioni corrette. Assicurati che l'utente del sito (ovvero non amministratore) sia l'impostazione predefinita.
(Inoltre, non memorizzo la configurazione del database, SECRET_KEY
o qualsiasi altra cosa sensibile in settings.py
perché il mio progetto Django è archiviato in Mercurial; Ho settings.py
estrai tutto ciò da un file esterno accessibile solo dall'utente di Django e dagli amministratori del server. Lascio il "come" come esercizio per il lettore... perché ne ho dettagliati alcuni nelle risposte alle domande degli altri, e sono troppo pigro per cercarlo in questo momento.)