2011-03-11 16 views
19

Me está surgiendo el problema de que South crea la tabla DB para un nuevo modelo como INNODB cuando migro pero crea la tabla como MYISAM cuando otro desarrollador ejecuta su propia migración.Establecer explícitamente el motor de almacenamiento de tablas MySQL usando South y Django

El problema con esto es que todas mis otras tablas son MYISAM, por lo que usar las tablas nuevas genera muchos errores de restricción de clave externa.

¿Cómo puedo asegurar explícitamente que la tabla se crea usando MYISAM?

¿Qué podría estar causando que la tabla se creara utilizando un motor de almacenamiento diferente en diferentes entornos?

Respuesta

22

para asegurarse de que todas las migraciones se realizan siempre utilizando InnoDB, habrá que ajustar el motor de almacenamiento InnoDB como en la definición de base de datos directamente como aquí:

DATABASES = { 
    'default': { 
     ... 
     'OPTIONS' : { 'init_command' : 'SET storage_engine=INNODB', }, 
    } 

Si está utilizando MySQL 5.7.x y superiores ,

DATABASES = { 
    'default': { 
     ... 
     'OPTIONS' : { 'init_command' : 'SET default_storage_engine=INNODB', }, 
    } 

Pero debe saber que puede tener un performance hit. Por lo tanto, es posible que desee establecer esta opción solo cuando se ejecutan migraciones.

+0

Para aclarar, esto va en settings.py, no en las migraciones. –

+2

Esto era exactamente lo que estaba buscando. Gracias. Para compensar el impacto en el rendimiento que mencionaste, agregué un condicional al respecto. Ahora solo se invocará cuando quiera modificar la base de datos (syncdb o modificar). 'import sys' ' if 'migrate' en sys.argv o 'syncdb' en sys.argv: ' –

+2

¿Cuál es la configuración correcta de storage_engine para MyISAM? ¿Está todo en mayúsculas o es una caja mezclada, o algo más? –

14

Si usa Sur, puede configurar STORAGE_ENGINE.

Django < 1,2

# add to your settings file 
DATABASE_STORAGE_ENGINE = 'INNODB' # django < 1.2 

Django> = 1,2

# add to your settings file 
DATABASES = { 
    'default': { 
     ... 
     'STORAGE_ENGINE': 'INNODB' 
    } 
} 
+0

Esta es la mejor respuesta (aunque hay un error tipográfico - debe ser ":" no "=", ver el enlace para la sintaxis correcta), ya que no tendrá los problemas de rendimiento mencionados anteriormente. El motor de almacenamiento solo se configurará cuando South realice una migración (por ejemplo, crear una tabla), pero no para otras operaciones de la base de datos, AIUI. –

+0

Daniel lo arregló :) – dnozay

+0

Nota para aquellos que trabajan en proyectos heredados con versiones anteriores de Django, pero MySQL más reciente: preste atención al comentario de Abhinav de que storage_engine está en desuso de MySQL 5.7.xy superior. Utilice ''DEFAULT_STORAGE_ENGINE'' en el archivo de configuración de Django, no'' STORAGE_ENGINE''. – MisterRios

Cuestiones relacionadas