web-dev-qa-db-fra.com

erreur de commande alembic util ne trouve pas l'identifiant

J'essaie d'utiliser alembic pour gérer les migrations locales sur mon projet. Cela a fonctionné la première fois, mais j'ai ensuite dû supprimer le dossier et redémarrer. (Ne demandez pas pourquoi, je devais juste) Je suis ce tutoriel et j'exécute la commande

python manage.py db init

Et c'était ok. Mais quand j'essaye de courir

python manage.py db migrate

Je reçois cette erreur:

alembic.util.CommandError: Can't locate revision identified by '31b8ab83c7d'

Maintenant, il semble qu'Alembic recherche une révision qui n'existe plus. Il y a de toute façon à faire oublier à alambic ce fichier? Ou comme recommencer la comparaison de Aucun à -> généré automatiquement à nouveau?

33
André Heringer

Alembic stocke l'historique des versions dans votre base de données. Par conséquent, il utilise la valeur stockée dans votre base de données pour rechercher la révision. Le numéro de version de ma base de données personnelle est stocké dans la table alembic_version:

mysql> SELECT * FROM alembic_version;
+-------------+
| version_num |
+-------------+
| c8ad125e063 |
+-------------+
1 row in set (0.00 sec)

Astuce: utilisez la commande SHOW TABLES s'il s'agit d'une base de données SQL pour voir les tables.

Pour résoudre votre problème, utilisez simplement la commande:

DROP TABLE alembic_version;

Ou quel que soit le nom de la table de version de la base de données. Et puis vous devez réinitialiser le dossier de migration à l'aide de la commande:

python manage.py db init

Et puis créer une nouvelle migration:

python manage.py db migrate

Et puis vous devriez être bon pour aller avec des migrations de travail en alambic.

74
SirKaiserKai

La solution de SirKaiserKai n'a pas fonctionné pour moi, probablement parce que j'ai fait une erreur stupide la dernière fois que j'ai migré et supprimé un fichier que j'aurais dû conserver.

Au lieu de supprimer le alembic_revision table Je viens de mettre à jour la valeur dans version_num pour correspondre à l'endroit où je savais que ma BD était.

Assurez-vous d'utiliser l'ID de migration du fichier qui correspond à l'état actuel de votre base de données

  1. Vérifiez le numéro de migration manquant

    psql=> SELECT * FROM alembic_version;
    +-------------------------+
    |      version_num        |
    +-------------------------+
    | <the missing migration> |
    +-------------------------+
    (1 row)
    
  2. Mettre à jour la valeur

    psql=> UPDATE alembic_version
    psql->    SET version_num = '<true state of DB>'
    psql->    WHERE version_num = '<the missing migration>';
    UPDATE 1
    

Si votre base de données est dans un état autre que le fichier de migration <true state of DB> alors vous allez continuer à avoir des erreurs. Cependant, vous pouvez exécuter un alembic upgrade head si la <true state of DB> est un fichier de migration qui reprend là où vous vous étiez arrêté précédemment, et qui exécuterait également toutes les migrations après cet état.

14
Shonin