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.)
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. –
¿Puede explicar qué significa 'using ('innodb')' y dónde agregarlo? –
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') '). –