Rust项目中sqlx迁移PostgreSQL遇已应用迁移缺失错误的求助
sqlx迁移错误:已应用的迁移文件找不到的原因与解决方法
错误含义
sqlx会在PostgreSQL数据库中维护一张_sqlx_migrations表,记录所有已成功执行的迁移版本信息。执行sqlx migrate run时,它会扫描本地指定目录的迁移文件,再与数据库表中的记录对比。若数据库表中存在某迁移版本(如你遇到的20231103093446),但本地找不到对应文件,就会抛出该错误。
你未手动删除文件的情况下,可能的触发原因:
- 迁移文件被误删(如IDE自动清理、系统垃圾回收)
- 文件被移至sqlx未配置扫描的目录
- 迁移文件的时间戳前缀被修改
- sqlx配置指定了错误的迁移目录(默认是项目根目录下的
migrations/)
解决方法
1. 确认本地文件状态
- 用系统文件搜索工具查找包含
20231103093446的文件,确认是否存在 - 检查sqlx配置:
- 查看
Cargo.toml中[package.metadata.sqlx]段的migrations_dir值,确认指向正确目录 - 或检查
.sqlx/config.json文件中的migrations_dir配置
- 查看
2. 根据文件存在情况处理
情况一:找到丢失的迁移文件
将文件移回sqlx配置的迁移目录,确保文件名与数据库记录的版本号完全一致,再重新执行sqlx migrate run。
情况二:确实找不到该文件
有两种可选方案:
- 方案A:从版本控制恢复
若项目使用Git等版本控制工具,从历史提交中找回对应的20231103093446_*.up.sql和20231103093446_*.down.sql文件,放到正确目录。 - 方案B:修改数据库迁移记录(谨慎操作)
- 连接PostgreSQL数据库,查询该迁移详情:
SELECT * FROM _sqlx_migrations WHERE version = '20231103093446'; - 确认该迁移内容无需保留或可重新执行后,删除这条记录:
DELETE FROM _sqlx_migrations WHERE version = '20231103093446';
- 连接PostgreSQL数据库,查询该迁移详情:
3. 验证解决效果
执行sqlx migrate info查看所有迁移状态,确认无异常后,再次执行sqlx migrate run应用新迁移。
内容的提问来源于stack exchange,提问作者Mr Coder
相关产品推荐
相关产品推荐

