已开启offline特性时cargo sqlx prepare仍生成存根文件问题咨询
问题原因及解决方法
多target报错原因
你的Rust包同时包含多个编译目标(比如同时存在lib库、bin二进制、测试用例等多个编译目标),cargo sqlx prepare底层会调用cargo check传递额外编译参数,Rust不允许同时给多个目标传递自定义rustc参数,所以必须指定单一目标。你添加-- --lib/-- --bin 二进制名称的操作已经解决了这个报错。
无查询结果警告的常见原因及修复
- 未开启sqlx的
offline特性
sqlx离线查询缓存功能默认关闭,需要在Cargo.toml的sqlx依赖中显式开启offline特性:
# 示例中用的是Postgres数据库,可根据实际情况替换为mysql/sqlite等对应特性 sqlx = { version = "你的项目sqlx版本号", features = ["postgres", "runtime-tokio-native-tls", "offline"] }
- 查询代码被条件编译屏蔽
如果sqlx相关代码被放在#[cfg(xxx)]条件编译块下,cargo sqlx prepare默认编译配置没有开启对应特性就会扫描不到查询,需要给命令追加对应特性参数:
cargo sqlx prepare --features "你的sqlx相关特性名" -- --lib
- sqlx-cli版本和项目依赖版本不匹配
本地安装的cargo-sqlx二进制版本如果和项目Cargo.toml里声明的sqlx版本不一致,也会出现扫描不到查询的问题,确认版本后重新安装对应版本的sqlx-cli即可:
# 版本号、数据库特性根据实际情况调整 cargo install sqlx-cli --version 匹配你项目的sqlx版本号 --no-default-features --features postgres,rustls
- 查询宏不在指定的编译目标中
如果你指定了--lib参数,但所有查询宏都写在二进制目标代码中(src/main.rs、src/bin/xxx.rs),lib目标里没有用到相关宏就会扫描不到,换成指定对应二进制目标即可:
cargo sqlx prepare -- --bin 你的二进制包名称
内容的提问来源于stack exchange,提问作者ryan
相关产品推荐
相关产品推荐

