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

Ale*_*air 13 alembic

我在一个团队中使用alembic来管理数据库迁移.我最近拉了主人,并试图跑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
Run Code Online (Sandbox Code Playgroud)

我试图跑的时候得到了同样的信息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)
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来像一个完美的历史.alembic heads报告a04c53fd8c74 (label_1, label_2) (head).

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

my_postgres=# SELECT * FROM alembic_version;
 version_num  
--------------
 a04c53fd8c74
 453d88f67d34
(2 rows)
Run Code Online (Sandbox Code Playgroud)

我可以通过Google搜索异常找到的唯一参考是源代码,我宁愿不通读.

这种情况怎么会发生?我该如何解决?"重叠"是什么意思?

Ale*_*air 16

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

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

我现在可以运行升级和降级.我的历史和头脑看起来都一样.但是我仍然不知道它为什么会发生,或者是否有一些微妙的混乱状态,所以如果有人有更好的答案,请发布它!

  • 当我不小心导入另一个数据库的一部分时,确实发生了这种情况 (2认同)

Sir*_*man 7

对于那些发现这一点的人来说,这也发生在我身上,因为我尝试将数据库恢复到旧版本,而不先删除它。alembic_version我相信你的表中应该只包含一行,version_num无论你的数据库当前是什么版本。

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