Как я могу исправить alembic "Запрошенная ревизия перекрывается с другими запрошенными версиями"?

Я работаю над командой, использующей alembic для управления миграциями db. Недавно я снял мастер и попытался запустить alembic upgrade heads. Я получил следующее сообщение:

INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
ERROR [alembic.util.messaging] Requested revision a04c53fd8c74 overlaps with other requested revisions 453d88f67d34
  FAILED: Requested revision a04c53fd8c74 overlaps with other requested revisions 453d88f67d34

Я получил то же сообщение, когда пытался запустить alembic downgrade -1. Выполнение alembic history печатает это;

453d88f67d34 -> a04c53fd8c74 (label_1, label_2) (head), Create such and such tables.
2f15c778e709, 9NZSZX -> 453d88f67d34 (label_1, label_2) (mergepoint), empty message
b1861bb8b23f, b8aa3acdf260 -> 2f15c778e709 (label_1, label_2) (mergepoint), Merge heads b18 and b8a
(...many more old revisions)

который для меня выглядит как прекрасная история. alembic heads сообщает a04c53fd8c74 (label_1, label_2) (head).

Единственное, что мне кажется странным, это то, что моя версия abmbic db имеет два значения:

my_postgres=# SELECT * FROM alembic_version;
 version_num  
--------------
 a04c53fd8c74
 453d88f67d34
(2 rows)

Единственная ссылка, которую я могу найти в googling исключение, - это исходный код, который я бы не прочитал.

Как могла сложиться такая ситуация? Как его исправить? Что означает "перекрытие"?

Ответ 1

Я "исправил" его, удалив более старый номер версии в базе данных;

my_postgres=# DELETE FROM alembic_version WHERE version_num = '453d88f67d34';
DELETE 1
my_postgres=# SELECT * FROM alembic_version;
 version_num  
--------------
 a04c53fd8c74
(1 row)

Теперь я могу запускать обновления и понижать. Моя история и головы выглядят одинаково. Но я до сих пор не знаю, почему это произошло, или есть какое-то состояние db, которое тонко перепутано, поэтому, если у кого-то есть лучший ответ, отправьте его!

Ответ 2

Для тех, кто это нашел, это случилось со мной, потому что я попробовал восстановить мою базу данных до более старой версии, не отбросив ее сначала. Я считаю, что в вашей таблице alembic_version должна быть только одна строка с version_num любой версии, на которой должна находиться ваша база данных.

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

Ответ 3

  1. Таблица alembic_version должна иметь только одну строку для согласованности.
  2. Если вы восстанавливаете данные базы данных из другой версии, операция восстановления ДОБАВИТ другую строку.
  3. После восстановления данных удалите строку, которая была добавлена из восстановить операцию.

Этот работал для меня:

delete from alembic_version where version_num='e69ad4aec63b';