Mysql
 sql >> Base de données >  >> RDS >> Mysql

Django a défini le moteur de stockage et le jeu de caractères par défaut

Je ne pense pas que vous puissiez modifier les moteurs de stockage table par table, mais vous pouvez le faire base de données par base de données. Cela signifie bien sûr que les contraintes de clé étrangère InnoDB, par exemple, ne peuvent pas s'appliquer aux clés étrangères des tables MyISAM.

Il faut donc déclarer deux "bases de données", qui peuvent très bien être sur le même serveur :

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

Et vous aurez juste besoin d'appliquer using('innodb') aux ensembles de requêtes pour les tables dans InnoDB land.

Quant à UTF-8, encore une fois, je pense que vous devez le faire au niveau de la base de données. Je ne pense pas que syncdb crée la base de données pour vous, juste les tables. Vous devez de toute façon créer la base de données manuellement, afin que vous puissiez définir les privilèges juste avant d'exécuter syncdb . La commande de création de base de données que vous voulez est :

CREATE DATABASE django CHARACTER SET utf8;

Cela dit, je recommande généralement aux utilisateurs de créer deux utilisateurs Django dans la base de données :un pour le travail de schéma de base de données ("admin") et un pour tout le reste (avec des mots de passe différents) :

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;

(Notez que cela doit être fait pour chaque base de données.)

Pour que cela fonctionne, vous devez modifier manage.py :

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

Puis dans votre settings.py , utilisez la variable d'environnement pour choisir les bons paramètres. Assurez-vous que l'utilisateur du site (c'est-à-dire non administrateur) est l'utilisateur par défaut.

(De plus, je ne stocke pas la configuration de la base de données, SECRET_KEY , ou tout autre élément sensible dans settings.py parce que mon projet Django est stocké dans Mercurial ; J'ai settings.py récupérez tout cela à partir d'un fichier externe accessible uniquement par l'utilisateur de Django et les administrateurs du serveur. Je vais laisser le "comment" comme exercice pour le lecteur... parce que j'en ai détaillé une partie dans les réponses aux questions des autres, et j'ai la flemme de le chercher maintenant.)