Mysql
 sql >> Database >  >> RDS >> Mysql

Django ha impostato il motore di archiviazione e il set di caratteri predefinito

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