如何修复 alembic 的“请求的修订与其他请求的修订重叠”?

问题描述 投票:0回答:5

我所在的团队使用 alembic 来管理数据库迁移。我最近拉了master,并尝试运行

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)

对我来说唯一看起来奇怪的是我的 alembic 版本数据库中有两个值;

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

我可以通过谷歌搜索异常找到的唯一参考是源代码,我不想通读它。

怎么会出现这种情况呢?我应该如何修复它? “重叠”是什么意思?

alembic
5个回答
21
投票

我通过删除数据库中的旧版本号来“修复”它;

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

我现在可以运行升级和降级。我的历史和头脑看起来都一样。但我仍然不知道为什么会发生这种情况,或者是否有一些数据库状态被巧妙地搞乱了,所以如果有人有更好的答案,请发布!


6
投票

对于那些发现这一点的人来说,这也发生在我身上,因为我尝试将数据库恢复到旧版本,而不先删除它。我相信您的

alembic_version
表中应该只包含一行,其中包含数据库当前应处于的任何版本的
version_num

因此,当我恢复数据库并且没有先删除它时,它没有替换当前版本号,而是添加了一个新行。为了修复它,我必须从我的 alembic 表中删除不正确的版本(无论数据库的版本号是什么,我都应该先删除)。 ...只是为了为 Altair 的答案提供更多背景信息。


3
投票
  1. alembic_version 表应该只有一行以保持一致性。
  2. 如果从另一个版本恢复数据库数据,恢复操作将添加另一行。
  3. 恢复数据后,删除添加的行 恢复操作。

这个对我有用:

delete from alembic_version where version_num='e69ad4aec63b';

0
投票
  1. 查找上次应用的迁移并复制修订名称。
  2. 删除
    alembic_version
    表中的所有记录。
  3. 插入复制的修订名称作为唯一的修订名称(记录 1)。
  4. alembic upgrade head

0
投票

仅供参考,其他评论的一些措辞似乎令人困惑。我也遇到了这个错误。

alembic_version
表只能包含一行。不应该超过一个。该行将是“最后应用的修订版”

© www.soinside.com 2019 - 2024. All rights reserved.