2011-01-29 11 views
5
$ py manage.py migrate turkey 
Running migrations for turkey: 
- Migrating forwards to 0001_initial. 
> turkey:0001_initial 
! Error found during real run of migration! Aborting. 

! Since you have a database that does not support running 
! schema-altering statements in transactions, we have had 
! to leave it in an interim state between migrations. 

! You *might* be able to recover with: = DROP TABLE `turkey_demorecs` CASCADE; [] 

! The South developers regret this has happened, and would 
! like to gently persuade you to consider a slightly 
! easier-to-deal-with DBMS. 
! NOTE: The error which caused the migration to fail is further up. 

Por alguna razón lo consigo cuando lo intento. Pero mis otras configuraciones están en MyISAM.¿Funciona el sur de Django (herramienta de migración) para innodb?

¿Por qué no funciona en Innodb?

Respuesta

1

Sí, South admite InnoDB. ¿Puedes eliminar el contenido de tu carpeta "migrations" y volver a ejecutar schemamigration, migrar y publicar los resultados y el contenido del archivo 0001_initial aquí? PD: asegúrese de hacer una copia de seguridad de la carpeta de migraciones o en primer lugar en el control de código fuente.

rm -fr app/migrations/* 
./manage.py schemamigration app --initial 
./manage.py migrate app 
3

Ver también https://code.djangoproject.com/wiki/AlterModelOnSyncDB

he tenido el mismo tipo de error ocurra a mí cuando se trabaja con una configuración de MySQL cuyo valor predeterminado motor de tabla es MyISAM y quería utilizar InnoDB (utilizando la receta que se encuentra en el enlace de arriba, usamos la señal post_syncdb para activar el código de conversión). Sin embargo, al usar South para crear nuevas tablas, primero se crearon utilizando el motor MyISAM y luego se convirtieron. Estaba creyendo erróneamente que las tablas de InnoDB no estaban haciendo lo que se suponía que debían, cuando esas eran realmente MyISAM; porque la tabla fueron convertidos por la señal, cualquier error de migración fallaría cancelar la aplicación: -/

Si es necesario utilizar o crear tablas InnoDB, donde el valor predeterminado es MyISAM, esto se soluciona con:

# add at the beginning of your migration 
if db.backend_name == 'mysql': 
    db.execute('SET storage_engine=INNODB') 

o si no te importa el impacto en el rendimiento:

# add this to settings.py 
DATABASE_OPTIONS = { 
    "init_command": "SET storage_engine=INNODB", # XXX: performance hit... 
} 
+0

¿Estás seguro? Ni siquiera tenemos el error original. – Tobu

+0

He tenido South me da el mismo mensaje 'usa un DBMS más fácil de manejar' cuando se trabaja con mysql configurado para usar MyISAM por defecto. No puedo estar seguro, pero es probable que sea el mismo problema. – dnozay

4

InnoDB tiene limitaciones de claves externas que aseguran que no está rompiendo el modelo de base de datos cuando se hace una migración. (Ver http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html)

MyISAM no tiene soporte nativo para las restricciones (aunque parece que se puede aplicar esto si usted elige hacer hacer http://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html)

Debido MyISAM no está comprobando sus relaciones FK, no obtiene la error. Sin embargo, InnoDB está haciendo un chequeo y parece que tienes un problema con tu migración.

1

Usted podría intentar agregar a su primera migración:

if db.backend_name == 'mysql': 
    db.execute('SET foreign_key_checks=0') 

Esto desactivará las restricciones de comprobación de claves externas.

No tiene que volver a establecerlo en 1 porque es una variable de sesión.

Por cierto, no funciona si configura 0 al inicio y vuelve a 1 al final de su método de migración, porque south genera SQL con ellos, pero lo ejecuta cuando regresan.

Cuestiones relacionadas