8

Creando mis tablas desde mi models.py. Me donno cómo hacer 2 cosas -Django set Motor de almacenamiento y juego de caracteres predeterminado

  1. que desea especificar MySQL para crear algunos de mis cuadros como InnoDB & algunos como MyISAM. ¿Cómo lo hago?
  2. También quiero especificar mis tablas DEFAULT CHARSET como utf8. ¿Cómo lo hago?

Esto es lo que veo cuando corro syncdb -

... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

Yo uso Ubuntu 10.04, Django 1.2.X, MySQL 5.1.x

ACTUALIZACIÓN: pensé que éstos podrían ser configuración predeterminada de MySQL & Terminé cambiando my.cnf donde agregué default-character-set = utf8. Pero no sirve.

Respuesta

17

No creo que pueda cambiar los motores de almacenamiento tabla por tabla, pero puede hacerlo base de datos por base de datos. Esto, por supuesto, significa que las restricciones de clave externa InnoDB, por ejemplo, no pueden aplicarse a claves externas a tablas MyISAM.

Así que hay que declarar dos "bases de datos", que puede muy bien estar en el mismo servidor:

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

Y sólo tendrá que aplicar a using('innodb') QuerySets para tablas InnoDB en la tierra.

En cuanto a UTF-8, una vez más, creo que debe hacer esto a nivel de base de datos. No creo que syncdb cree la base de datos para usted, solo las tablas. Debe crear la base de datos manualmente de todos modos, para que pueda tener los privilegios establecidos justo antes de ejecutar syncdb. El comando de creación de base de datos que desea es:

CREATE DATABASE django CHARACTER SET utf8; 

Dicho esto, por lo general recomiendan que las personas crean dos usuarios de Django en la base de datos: una para el trabajo de esquema de base de datos ("admin") y otro para todo lo demás (con diferentes contraseñas):

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; 

(Tenga en cuenta que esto tiene que ser hecho para cada base de datos)

para que esto funcione, es necesario modificar manage.py:.

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

Luego, en su settings.py, use la variable de entorno para elegir la configuración correcta. Asegúrese de que el usuario del sitio (es decir, no administrador) sea el predeterminado.

(Además, no almacenar la configuración de base de datos, SECRET_KEY, o cualquier otra cosa sensible settings.py porque mi proyecto Django se almacena en Mercurial; tengo settings.py tirar todo lo que desde un archivo externo accesible sólo por el usuario y de Django los administradores del servidor. Dejaré el "cómo" como un ejercicio para el lector ... porque detallé algo de eso en respuestas a las preguntas de los demás, y soy demasiado flojo para buscarlo ahora mismo.)

+3

Bueno, * se puede * mezclar InnoDB y MyISAM en una base de datos. Lo aprendí de la peor manera cuando algunas de mis claves externas no se aplicaron y algunas de ellas sí. Entonces, es una buena idea establecer el tipo de tabla por defecto de MySQL en InnoDB. De lo contrario, incluso un volcado y la posterior recarga pueden cambiar los tipos de tabla, si olvida volcar esta información. –

+0

¿Puede explicar qué significa 'using ('innodb')' y dónde agregarlo? –

+0

Un 'QuerySet', por defecto, usa la base de datos especificada en' settings.DATABASES ['default'] '. Para usar una base de datos diferente (por ejemplo, la llamada '' innodb'' en mi ejemplo anterior), debe llamar a la función 'using' en' QuerySet' (por ejemplo '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

gracias por el código en bruto. –

Cuestiones relacionadas