59

我正在尝试使用 alembic 来处理我的项目中的本地迁移。它第一次工作,但后来我需要删除文件夹并重新启动。(不要问为什么,我只是不得不)我正在关注本教程并运行命令

python manage.py db init

没关系。但是当我尝试跑步时

python manage.py db migrate

我收到此错误:

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

现在,alembic 似乎正在寻找一个不再存在的修订版。反正有让alembic忘记那个文件吗?或者像重新开始比较从无到 - > 再次自动生成?

4

3 回答 3

111

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中进行工作迁移。

于 2015-09-02T14:57:54.320 回答
20

SirKaiserKai 的解决方案对我不起作用,可能是因为我上次迁移并删除了我应该保留的文件时犯了一些愚蠢的错误。

我没有删除alembic_revision表,而是更新了值version_num以匹配我知道我的数据库所在的位置。

确保使用与数据库当前状态匹配的文件的迁移 ID

  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>是从您之前停止的位置继续的迁移文件,您可以运行 a,并且这也将运行此状态后的所有迁移。

于 2016-04-19T14:41:52.680 回答
4

如果您遇到上述相同的问题,请运行以下命令:

Drop your local Alembic table

 - drop table alembic_version;

然后运行以下 alembic 命令:

 - alembic stamp head
 - alembic revision --autogenerate -m "New revision"
 - alembic upgrade head
 - alembic stamp head

戳头允许 alembic 拥有最新的表格结构。在运行新修订之前。

于 2020-09-21T11:22:27.760 回答