我正在尝试使用 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 忘记那个文件?或者重新开始比较从 None 到 -> 自动生成?
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 中进行工作迁移。
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>
,那么您将继续出现错误。但是,您可以运行一个
alembic upgrade head
如果 <true state of DB>
是一个从您之前中断的地方继续的迁移文件,那么也会运行此状态后的所有迁移。
如果您遇到上述相同问题,请运行以下命令:
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 拥有最新的表结构。在运行新修订之前。
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
ERROR [alembic.util.messaging] Can't locate revision identified by 'c140cfa017b4'
FAILED: Can't locate revision identified by 'c140cfa017b4'
答案:
注意: 我在 Ubuntu PostgreSQL 中解决了这个问题
在 Ubuntu 中打开 PostgreSQL,它会询问密码
sudo -u postgres psql
转到您的数据库
\c <databasename>
显示数据库中的所有表
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
Show all data in the table in the table in the table if you find the revision number (e.g.,
c140cfa017b4
)
select * from table name;
放下桌子
DROP TABLE <table name>;
如果解决了你可以继续你的工作