2010-11-07 16 views
18

che ho incontrato lo stesso problema presentato dal commentatore qui: Django South - table already existsNo tale errore Colonna in Django App dopo la migrazione Sud

Non c'era alcun follow-up, quindi ho pensato di pubblicare una nuova domanda. Ho un'app Django di cui gestisco le migrazioni con South. Ho aggiunto un campo al mio modello, quindi ho eseguito

./manage schemamigration my_app --auto 

che ha funzionato come previsto. In esecuzione

./manage migrate my_app 

tuttavia, ha provocato un errore che indica che la tabella associata al modello I modificato esiste già. Questo mi ha portato alla domanda di cui sopra collegato, in modo da correre

./manage migrate my_app --fake 

risolto l'errore tavolo, ma ora sto ottenendo un errore di Django che la colonna associata al nuovo campo non esiste.

./manage sqlall my_app 

mostra lo schema come previsto.

Qualche idea su come rimediare a questo è apprezzata!

risposta

32

Probabilmente il modo più semplice per iniziare le migrazioni da zero.

Elimina tutti i file migrations/* per l'app che si tenta di risolvere. Ripristina il tuo models.py nello stato che è al momento sul database (con l'aiuto degli strumenti di controllo della versione, o commenta solo i nuovi campi). Quindi inizializzare le migrazioni:

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

Ciò creerà un record nelle migrazioni dell'aspetto della struttura attuale del database.

Ora aggiungere le modifiche al models.py e sud sarà ora cosa è cambiato:

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

Assicurati anche di eliminare tutte le voci del database relative alle migrazioni di schemi eseguite da sud anche in precedenza (se hai sbagliato). @drew: il tuo errore principale era che avresti dovuto eseguire la migrazione iniziale ed eseguire './manage migrate my_app --fake' PRIMA di aggiungere il nuovo campo al modello! –

+1

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

+0

Oh scusa. Ho trascurato che in qualche modo ... –

5

Un'altra cosa da tenere d'occhio per: spesso è possibile ottenere questo errore (DatabaseError: no such column: appname_model.fieldname) se si utilizza un valore default in una relazione ForeignKey e si aggiunge un campo a tale modello FK.

Qualcosa di simile (nel vostro models.py):

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

Poi, in una nuova migrazione, si aggiunge un nuovo campo per la vostra FkModel:

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

otterrete un errore durante l'esecuzione di un Sud schemamigration:

DatabaseError: no such column: myappmodel_fkmodel.new_field

Puoi risolvere questo problema assicurandoti che la tua migrazione iniziale a sud includa questa funzione di valore lambda, ma poi rimuovi il valore predefinito nella prossima migrazione.

Questo mi ha morso in passato. Spero che possa aiutare qualcuno in futuro.

Problemi correlati