2010-11-07 17 views
18

me he encontrado con el mismo problema presentado por el comentarista aquí: Django South - table already existshay tal error Columna en Django aplicación después de la migración Sur

No hubo seguimiento, así que pensé que había puesto una nueva pregunta. Tengo una aplicación de Django cuyas migraciones administro con South. Agregué un campo a mi modelo y luego ejecuté

./manage schemamigration my_app --auto 

que funcionó como se esperaba. Sin ejecutar

./manage migrate my_app 

, se produjo un error que indica que la tabla asociada con el modelo I cambiado ya existe. Esto me llevó a la pregunta vinculado anteriormente, por lo que ejecutar

./manage migrate my_app --fake 

resuelto el error mesa, pero ahora que estoy recibiendo un error de Django que la columna asociada con el nuevo campo no existe.

./manage sqlall my_app 

muestra que el esquema es el esperado.

¡Cualquier idea sobre cómo remediar esto se agradece!

Respuesta

32

Probablemente la forma más fácil para usted será iniciar migraciones desde cero.

Elimine todos los archivos migrations/* de la aplicación que intenta corregir. Restaure su models.py al estado que se encuentra actualmente en la base de datos (con la ayuda de herramientas de control de versiones, o simplemente comente los nuevos campos). A continuación, inicializar las migraciones:

manage.py migrate my_app --delete-ghost-migrations 
manage.py schemamigration my_app --init 
manage.py migrate my_app --fake 

Esto creará un registro en migraciones de qué estructura base de datos actual se parece.

Ahora añadir sus cambios a models.py y ahora lo que ha cambiado al sur:

manage.py schemamigration my_app --auto 
manage.py migrate my_app 
+0

Asegúrese también de eliminar todas las entradas de la base de datos acerca de las migraciones de esquema que South ha hecho anteriormente también (si lo estropeó). @drew: tu error principal fue que deberías haber realizado la migración initali y ejecutar './manage migrate my_app --fake' ¡ANTES de agregar el nuevo campo al modelo! –

+1

@lazerscience 'manage.py migrate my_app --delete-ghost-migrations' hace la cosa. – Ski

+0

Oh, lo siento. Pasé por alto que de alguna manera ... –

5

Algo más para mantener un ojo hacia fuera para: a menudo obtendrá este error (DatabaseError: no such column: appname_model.fieldname) si está utilizando un valor default en una relación ForeignKey, y agrega un campo a ese modelo FK.

Algo así como (en su models.py):

class MyAppModel(models.Model): 
    my_foreign_key = models.ForeignKey(FkModel, 
             default=lambda: FkModel.objects.get(id=1), 
             null=True) 

Luego, en una nueva migración, se añade un nuevo campo a su FkModel:

class FkModel(models.Model): 
    new_field = models.IntegerField('New Field Name', blank=True, null=True) 

obtendrá un error cuando se ejecuta un Sur schemamigration:

DatabaseError: no such column: myappmodel_fkmodel.new_field

Puede resolver esto asegurándose de que su migración sur inicial incluya esta función de valor predeterminado lambda, pero luego elimine el valor predeterminado en la siguiente migración.

Esto me ha mordido en el pasado. Con suerte, ayudará a alguien en el futuro.

Cuestiones relacionadas