Ошибка команды 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
чтобы оно соответствовало тому, где я знал, что моя БД была.
Убедитесь, что вы используете идентификатор миграции файла, который соответствует текущему состоянию вашей базы данных
-
Проверьте отсутствующий номер миграции
psql=> SELECT * FROM alembic_version;
+-------------------------+
| version_num |
+-------------------------+
| <the missing migration> |
+-------------------------+
(1 row)
-
Обновить значение
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>
- это файл миграции, продолжающийся с того места, где вы остановились ранее, и он также запустит все миграции после этого состояния.