Ошибка команды alembic util не может найти идентификатор

Я пытаюсь использовать alembic для обработки локальных миграций в моем проекте. Он работал в первый раз, но затем мне нужно было удалить папку и перезагрузить. (Не спрашивайте, почему, я просто должен был). Я следую этому руководству, и я запускаю команду

python manage.py db init

И все в порядке. Но когда я пытаюсь запустить

python manage.py db migrate

Я получаю эту ошибку:

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

Теперь кажется, что alembic ищет версию, которая больше не существует. В любом случае, чтобы alembic забыл этот файл? Или как перезапустить сравнение с None на → auto-generated снова?

Ответы

Ответ 1

Alembic хранит историю версий в вашей базе данных. Следовательно, для поиска изменений используется значение, хранящееся в вашей базе данных. Номер версии для моей личной базы данных хранится в таблице alembic_version:

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

Совет. Используйте команду SHOW TABLES если она база данных на базе SQL, чтобы увидеть таблицы.

Чтобы решить вашу проблему, просто используйте команду:

DROP TABLE alembic_version;

Или независимо от названия таблицы версий базы данных. И тогда вам нужно перезапустить папку миграции с помощью команды:

python manage.py db init

А затем создайте новую миграцию:

python manage.py db migrate

И тогда вам должно быть хорошо идти с рабочими миграциями в alembic.

Ответ 2

Решение SirKaiserKai не сработало для меня, вероятно, потому что я сделал глупую ошибку в прошлый раз, когда перенес и удалил файл, который я должен был сохранить.

Вместо того, чтобы отбрасывать таблицу alembic_revision я просто обновил значение в version_num чтобы оно соответствовало тому, где я знал, что моя БД была.

Убедитесь, что вы используете идентификатор миграции файла, который соответствует текущему состоянию вашей базы данных

  1. Проверьте отсутствующий номер миграции

    psql=> SELECT * FROM alembic_version;
    +-------------------------+
    |      version_num        |
    +-------------------------+
    | <the missing migration> |
    +-------------------------+
    (1 row)
    
  2. Обновить значение

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

Если ваша база данных находится в состоянии, отличном от файла миграции <true state of DB> то вы просто будете продолжать иметь ошибки. Однако вы можете запустить alembic upgrade head если <true state of DB> - это файл миграции, продолжающийся с того места, где вы остановились ранее, и он также запустит все миграции после этого состояния.