sql >> Base de Datos >  >> RDS >> Mysql

Django establece el motor de almacenamiento y el juego de caracteres predeterminado

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 de InnoDB, por ejemplo, no se pueden aplicar a las claves externas de las tablas MyISAM.

Por lo tanto, debe declarar dos "bases de datos", que muy bien pueden 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 solo tendrá que aplicar using('innodb') a conjuntos de consultas para tablas en InnoDB land.

En cuanto a UTF-8, nuevamente, creo que debe hacer esto en el nivel de la base de datos. No creo que syncdb crea la base de datos para usted, solo las tablas. Debe crear la base de datos manualmente de todos modos, para que pueda establecer los privilegios 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, generalmente recomiendo que las personas creen dos usuarios de django en la base de datos:uno para el trabajo del esquema de la 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 debe hacerse para cada base de datos).

Para que esto funcione, debe 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 tu 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 almaceno la configuración de la base de datos, SECRET_KEY , o cualquier otra cosa confidencial en settings.py porque mi proyecto Django está almacenado en Mercurial; Tengo settings.py obtenga todo eso desde un archivo externo al que solo pueden acceder el usuario de Django y los administradores del servidor. Dejaré el "cómo" como ejercicio para el lector... porque detallé parte de esto en las respuestas a las preguntas de otros, y soy demasiado perezoso para buscarlo ahora).