Je ne pense pas que vous puissiez changer les moteurs de stockage table par table, mais vous pouvez le faire base de données par base de données. Ceci, bien sûr, signifie que les contraintes de clé étrangère InnoDB, par exemple, ne peuvent pas s'appliquer aux clés étrangères des tables MyISAM.
Donc, vous devez déclarer deux « bases de données », qui peut 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')
à QuerySets pour les tables dans les terres InnoDB. Comme pour UTF-8, encore une fois, je pense que vous devez faire cela au niveau de la base de données. Je ne pense pas syncdb
crée la base de données pour vous, juste les tables. Vous devez quand même créer la base de données manuellement, afin que vous puissiez définir des privilèges 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 que les gens créent 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 ce qui 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"
Ensuite, 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 la valeur par défaut.
(De plus, je ne stocke pas la configuration de base de données, SECRET_KEY
, ou toute autre chose sensible settings.py
parce que mon projet Django est stocké dans Mercurial, j'ai settings.py
tirer tout cela depuis un fichier externe accessible uniquement par l'utilisateur de Django et les admins du serveur Je vais laisser le "comment" comme un exercice pour le lecteur ... parce que j'en ai détaillé certains dans les réponses aux questions des autres, et je suis trop paresseux pour le rechercher maintenant.
Eh bien, vous pouvez * mixer * InnoDB et MyISAM dans une seule base de données. Je l'ai appris à la dure quand certaines de mes clés étrangères n'étaient pas appliquées et certaines d'entre elles l'étaient. Donc, c'est une bonne idée de définir le type de table par défaut MySQL à InnoDB. Sinon, même un vidage et un rechargement ultérieur peuvent changer les types de table, si vous oubliez de vider cette information. –
Pouvez-vous expliquer ce que 'using ('innodb')' signifie et où l'ajouter? –
Un 'QuerySet' utilise par défaut la base de données spécifiée dans' settings.DATABASES ['default'] '. Pour utiliser une base de données différente (par exemple celle appelée '' innodb'' dans mon exemple ci-dessus), vous devez appeler la fonction 'using' sur' QuerySet' (par exemple 'Foo.objects.filter (...). ('innodb') '). –