8

Erstellen meiner Tabellen von meinem models.py. Ich donno wie 2 Dinge tun -Django Set Speicher Engine & Default Charset

  1. Ich möchte MySQL angeben einige meiner Tabellen InnoDB & einigen als MyISAM zu erstellen. Wie mache ich es?
  2. Auch ich möchte meine Tabellen DEFAULT CHARSET als utf8 angeben. Wie mache ich es?

Dies ist, was ich sehe, wenn ich syncdb laufen -

... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

verwende ich Ubuntu 10.04, Django 1.2.X, MySQL 5.1.x

UPDATE: ich diese dachte könnte sein MySQL-Standardeinstellungen & Ich endete Änderung my.cnf, wo ich default-character-set = utf8 hinzugefügt. Aber nutzlos.

Antwort

17

Ich glaube nicht, dass Sie Storage-Engines Tabellen für Tabellen ändern können, aber Sie können dies Datenbank für Datenbank tun. Dies bedeutet natürlich, dass InnoDB-Fremdschlüsseleinschränkungen beispielsweise nicht auf Fremdschlüssel für MyISAM-Tabellen angewendet werden können.

Sie müssen also zwei „Datenbanken“ erklären, die sehr gut auf dem gleichen Server sein kann:

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

Und Sie brauchen nur using('innodb') zu querysets für Tabellen in InnoDB Land anzuwenden.

Wie für UTF-8, ich denke, Sie müssen dies auf der Datenbankebene tun. Ich glaube nicht, syncdb erstellt die Datenbank für Sie, nur die Tabellen. Sie sollten die Datenbank trotzdem manuell erstellen, damit Sie die Rechte festlegen können, bevor Sie syncdb ausführen. Die Erstellung der Datenbank Befehl Sie wollen, ist:

CREATE DATABASE django CHARACTER SET utf8; 

Das heißt, ich empfehlen in der Regel, dass die Menschen zwei django Benutzer in der Datenbank zu erstellen: eine für die Datenbank-Schema der Arbeit („admin“) und eine 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 getan werden muss)

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

Verwenden Sie dann in Ihrer settings.py die Umgebungsvariable, um die richtigen Einstellungen auszuwählen. Stellen Sie sicher, dass der Site-Benutzer (d. H. Nicht-Administrator) der Standard ist.

(Außerdem habe ich nicht speichern Sie die Datenbank-Setup, SECRET_KEY, oder irgendetwas anderes empfindlich in settings.py weil mein Django-Projekt in Mercurial gespeichert ist, ich habe settings.py ziehen, dass alle von einer externen Datei nur mit dem Django des Benutzers und Ich werde das "Wie" als eine Übung für den Leser hinterlassen ... weil ich einige davon in Antworten auf die Fragen anderer dargelegt habe, und ich bin zu faul, um es jetzt zu suchen.)

+3

Nun, Sie * können * InnoDB und MyISAM in einer Datenbank mischen. Ich habe es auf die harte Tour gelernt, als einige meiner Fremdschlüssel nicht durchgesetzt wurden und einige von ihnen waren. Daher ist es eine gute Idee, den MySQL-Standardtabellentyp auf InnoDB zu setzen. Sonst kann sogar ein Dump und ein nachfolgender Reload die Tabellentypen ändern, wenn Sie vergessen, diese Informationen zu speichern. –

+0

Können Sie bitte erklären, was 'using ('innodb')' bedeutet und wo es hinzuzufügen? –

+0

Ein 'QuerySet' verwendet standardmäßig die in' settings.DATABASES ['default'] 'angegebene Datenbank. Um eine andere Datenbank zu verwenden (zB die mit "innodb" in meinem obigen Beispiel), müssen Sie die Funktion 'using' im' QuerySet' aufrufen (zB 'Foo.objects.filter (...). Using ('innodb') '). –

2
CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `firstname` varchar(32) NOT NULL, 
    `lastname` varchar(32) NOT NULL, 
    `gender` varchar(6) NOT NULL, 
    `email` varchar(32) NOT NULL, 
    `username` varchar(32) NOT NULL, 
    `password` varchar(32) NOT NULL, 
    `created` datetime NOT NULL, 
    `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ; 
+0

danke für den Rohcode. –