8

Création de mes tables à partir de mon models.py. Je donno comment faire 2 choses -Django définir le moteur de stockage et le jeu de caractères par défaut

  1. Je veux préciser MySQL pour créer certains de mes tableaux comme InnoDB & certains comme MyISAM. Comment fait-on ça?
  2. Aussi je veux spécifier mes tables DEFAULT CHARSET comme utf8. Comment fait-on ça?

C'est ce que je vois quand je lance syncdb -

... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

J'utilise Ubuntu 10.04, Django 1.2.X, MySQL 5.1.X

MISE À JOUR: Je pensais que ceux-ci pourraient être MySQL paramètres par défaut & J'ai fini par changer my.cnf où j'ai ajouté default-character-set = utf8. Mais à aucun usage.

Répondre

17

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.

+3

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

+0

Pouvez-vous expliquer ce que 'using ('innodb')' signifie et où l'ajouter? –

+0

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

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

merci pour le code brut. –