2015-09-26 19 views
5

Utilizzo Flask-Migrate (Alembic) per l'aggiornamento del database. Ho aggiornato il mio file models.py ma ho fatto un errore. Ho eseguito una migrazione e sono andato per aggiornare il database, ma ho ottenuto questo errore:Impossibile eseguire la migrazione o l'aggiornamento del database con Flask-Migrate (Alembic)

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n'] 

quello che avevo fatto era ha db.Text invece di db.Integer per una chiave esterna.

Quando provo eseguire una nuova migrazione ottengo questo:

alembic.util.CommandError: Target database is not up to date. 

Così ora mi sono bloccato. Non riesco ad aggiornare il database né eseguire una migrazione. Ho cercato di tornare a una versione base di dati più vecchia utilizzando qualcosa di simile:

python manage.py db downgrade --sql b877018671c:36949b1cca31 

Ma quando corro python manage.py db current ho la versione del database più recente, che mi sono bloccato in

C'è una correzione per questo.? Grazie.

+0

Sembra che tu abbia una migrazione (quella cattiva) che non hai ancora eseguito. Modificalo come corretto o cancellalo e genera nuovamente la migrazione. – dirn

+0

Come si elimina una migrazione? –

+0

Le migrazioni sono solo file. Devi solo cancellare il file. Flask-Migrate tipicamente li memorizza all'interno di 'migrations/version'. – dirn

risposta

10

Alembic memorizza la versione db in una tabella creata denominata alembic_version. Questa tabella contiene un singolo campo e riga alembic_version.version_num. Assicurati che il valore per questo corrisponda al nome file del file più recente in migrations/version. Questo numero di versione è contenuto anche nel file di revisione nella variabile revision che generalmente si trova sulla riga 26 del file. Assicurati che corrisponda alla versione db.

Un'altra opzione è semplicemente di eliminare il db e ricrearlo utilizzando l'alambicco. Se questo è un ambiente di sviluppo, in cui i dati non sono importanti, questa sarebbe la mia raccomandazione.

+0

Ho avuto lo stesso problema e la soluzione ha funzionato, ma sono confuso su una questione. In realtà, ho eseguito accidentalmente lo stesso comando di migrazione due volte, quindi nella mia cartella migrazioni/versioni sono state create due stesse migrazioni, la prima in effetti rifletteva le modifiche sul mio modello, la seconda era vuota. Pensi che abbia avuto questo problema a causa di questo? Perché quando ho controllato alembic_version il numero corrisponde alla prima migrazione ma non al secondo – Humoyun

+0

Non dovrebbe causare problemi, dal momento che se apri il secondo script di migrazione vedrai che in realtà non fa nulla. Se sei un OCD (come me), puoi eliminare il secondo file di migrazione che non è necessario. Assicurati che il valore di 'alembic_version.version_num' corrisponda al nome del file del primo (corretto) script di migrazione. –

4

Mi sento come se la risposta accettata fosse un po 'complicata. Ho avuto questo stesso problema e il modo in cui ho risolto era semplicemente eliminare la migrazione che conteneva gli errori di codifica. Non ne hai comunque bisogno poiché, ancora, è stato codificato in modo errato. Trova la migrazione più recente nella cartella migrations/versions, eliminala, quindi esegui di nuovo la migrazione e aggiorna. Non è necessario eliminare i dati nel database solo per migrarlo.

+0

esattamente quello che ho fatto :) – danidee