使用sqlx查询PostgreSQL遇uuid特性缺失错误,求解决方法
解决sqlx查询PostgreSQL UUID类型报错的问题
错误核心原因
这个报错有两个关键诱因:
- sqlx的PostgreSQL驱动默认未启用
uuid特性,无法识别并处理数据库中的UUID类型列 - 代码里用
uuid::fmt::Hyphenated作为字段类型,而sqlx无法直接将数据库原生UUID值映射到这种格式化后的类型
具体解决步骤
1. 启用sqlx的uuid特性
修改Cargo.toml里的sqlx依赖配置,添加uuid特性(同时保留项目需要的其他特性,比如postgres、异步运行时):
[dependencies] sqlx = { version = "0.7", features = ["postgres", "uuid", "runtime-tokio-native-tls"] } uuid = { version = "1.0", features = ["v4"] }
注:runtime特性根据项目实际使用的异步运行时选择,比如用async-std就替换为
runtime-async-std-native-tls
2. 修正结构体字段类型
将User结构体的id字段类型从uuid::fmt::Hyphenated改为Uuid,sqlx会自动完成数据库UUID到Uuid类型的映射:
use sqlx::{Pool, Postgres, FromRow}; use uuid::Uuid; #[derive(FromRow)] struct User { id: Uuid } // 查询代码无需修改 let result = sqlx::query_as!(User, "SELECT id FROM users") .fetch_one(pool) .await .expect("QUERY FAILED"); // 如果需要连字符格式的字符串输出,后续调用to_hyphenated()即可 println!("User ID: {}", result.id.to_hyphenated());
验证
重新编译运行代码,报错会消失,sqlx可以正常读取users表中的id字段。
内容的提问来源于stack exchange,提问作者Roman Mahotskyi
相关产品推荐
相关产品推荐

