我试图使用alembic来处理我项目的本地迁移。它第一次工作,但后来我需要删除文件夹并重新启动。(不要问为什么,我只是必须)我跟随this tutorial并运行命令
python manage.py db init
没关系。但是当我试图运行时
python manage.py db migrate
我收到此错误:
alembic.util.CommandError: Can't locate revision identified by '31b8ab83c7d'
现在,似乎alembic正在寻找一种不再存在的修订版。无论如何,让alembic忘记那个文件?或者重新启动比较从无到 - >再次自动生成?
答案 0 :(得分:69)
Alembic将版本历史记录存储在您的数据库中。因此,它使用存储在数据库中的值来搜索修订。我的个人数据库的版本号存储在表alembic_version
:
mysql> SELECT * FROM alembic_version;
+-------------+
| version_num |
+-------------+
| c8ad125e063 |
+-------------+
1 row in set (0.00 sec)
提示:如果是基于SQL的数据库,请使用命令SHOW TABLES
来查看表。
要解决您的问题,只需使用命令:
DROP TABLE alembic_version;
或者数据库版本表的名称是什么。 然后,您需要使用以下命令重新启动迁移文件夹:
python manage.py db init
然后创建一个新的迁移:
python manage.py db migrate
然后你应该好好在alembic进行迁移工作。
答案 1 :(得分:13)
SirKaiserKai的解决方案对我不起作用,可能是因为我上次迁移并删除了一个我应该保存的文件时犯了一些愚蠢的错误。
我没有删除alembic_revision
表,而是更新了version_num
中的值,以匹配我知道我的数据库所在的位置。
确保使用与数据库当前状态相匹配的文件的迁移ID
检查缺少的迁移号
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>
以外的状态,那么您将继续遇到错误。
答案 2 :(得分:0)
如果遇到上述相同问题,请运行以下命令:
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具有最新的桌子结构。在运行新修订之前。