Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Django-Set Speicher-Engine und Standard-Zeichensatz

Ich glaube nicht, dass Sie Speicher-Engines tabellenweise ändern können, aber Sie können dies datenbankweise tun. Das bedeutet natürlich, dass beispielsweise InnoDB-Fremdschlüsselbeschränkungen nicht auf Fremdschlüssel von MyISAM-Tabellen angewendet werden können.

Sie müssen also zwei "Datenbanken" deklarieren, die sich sehr gut auf demselben Server befinden können:

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

Und Sie müssen nur using('innodb') anwenden zu Abfragesätzen für Tabellen im InnoDB-Land.

Auch bei UTF-8 denke ich, dass Sie dies auf Datenbankebene tun müssen. Ich glaube nicht, dass syncdb erstellt die Datenbank für Sie, nur die Tabellen. Sie sollten die Datenbank sowieso manuell erstellen, damit Sie Rechte direkt vor dem Ausführen von syncdb festlegen können . Der gewünschte Datenbankerstellungsbefehl lautet:

CREATE DATABASE django CHARACTER SET utf8;

Abgesehen davon empfehle ich normalerweise, dass die Leute zwei Django-Benutzer in der Datenbank erstellen:einen für die Datenbankschemaarbeit ("admin") und einen für alles andere (mit unterschiedlichen Passwörtern):

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;

(Beachten Sie, dass dies für jede Datenbank durchgeführt werden muss.)

Damit dies funktioniert, müssen Sie manage.py ändern :

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

Dann in deiner settings.py , verwenden Sie die Umgebungsvariable, um die richtigen Einstellungen auszuwählen. Stellen Sie sicher, dass der Site-Benutzer (d. h. Nicht-Administrator) der Standardbenutzer ist.

(Außerdem speichere ich das Datenbank-Setup nicht, SECRET_KEY , oder irgendetwas anderes Sensibles in settings.py weil mein Django-Projekt in Mercurial gespeichert ist; Ich habe settings.py Ziehen Sie all das aus einer externen Datei, auf die nur Djangos Benutzer und die Serveradministratoren zugreifen können. Ich überlasse das "Wie" als Übung für den Leser ... weil ich einiges davon in Antworten auf die Fragen anderer ausführlich beschrieben habe und ich jetzt zu faul bin, es nachzuschlagen.)