web-dev-qa-db-fra.com

Impossible de migrer ou de mettre à niveau la base de données avec Flask-Migrate (Alembic)

J'utilise Flask-Migrate (Alembic) pour mettre à jour ma base de données. J'ai mis à jour mon models.py fichier mais j'ai fait une erreur. J'ai exécuté une migration et suis allé mettre à niveau la base de données, mais j'ai eu cette erreur:

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']

Ce que j'avais fait, c'était db.Text au lieu de db.Integer pour une clé étrangère.

Lorsque j'essaie d'exécuter une nouvelle migration, j'obtiens ceci:

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

Alors maintenant je suis coincé. Je ne peux pas mettre à niveau la base de données ni exécuter une migration. J'ai essayé de rétrograder vers une version de base de données plus ancienne en utilisant quelque chose comme ceci:

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

Mais quand je lance python manage.py db current J'obtiens la dernière version de la base de données dans laquelle je suis coincé.

Y a-t-il une solution à cela? Merci.

12
Pav Sidhu

Alembic stocke la version db dans une table qu'il crée appelée alembic_version. Cette table contient un seul champ et une seule ligne alembic_version.version_num. Assurez-vous que la valeur de ceci correspond au nom de fichier du fichier le plus récent dans migrations/version. Ce numéro de version est également contenu dans le fichier de révision dans la variable revision qui apparaît généralement à la ligne 26 du fichier. Assurez-vous qu'il correspond à la version db.

Une autre option consiste simplement à supprimer la base de données et à la recréer à l'aide d'alambic. S'il s'agit d'un environnement de développement où les données ne sont pas importantes, ce serait ma recommandation.

17

J'ai l'impression que la réponse acceptée est un peu trop compliquée. J'ai eu ce même problème et la façon dont je l'ai résolu était de simplement supprimer la migration qui contenait les erreurs de codage. Vous n'en avez pas besoin de toute façon car, encore une fois, il a été mal codé. Trouvez la dernière migration dans le migrations/versions dossier, supprimez-le, puis relancez votre migration et effectuez une mise à niveau. Vous n'avez pas besoin de supprimer les données de votre base de données uniquement pour les migrer.

11
Taehan Stott

alembic.util.CommandError: la base de données cible n'est pas à jour.

Pourriez-vous essayer de suivre les étapes?

python manage.py db stamp head
python manage.py db migrate
python manage.py db upgrade

"tamponner" la table de révision avec la révision donnée; ne pas exécuter de migrations

4
Jun