在Rust SQLx中使用Postgres自定义枚举查询时报错如何解决?
解决sqlx查询Postgres自定义枚举类型时的"unsupported type"错误
问题原因
sqlx::query_as!是编译时宏,无法自动推导自定义枚举类型与Postgres枚举的映射关系,必须显式指定列对应的Rust类型,否则会触发"unsupported type"错误。
解决方案
1. 显式标注查询列的类型映射
将SELECT *改为明确列出所有字段,并对role字段添加类型标注,告诉宏该列对应Rust的Role枚举:
let user = match sqlx::query_as!( User, r#" SELECT id, email, username, password, role as "role: Role", created_at, updated_at FROM users WHERE email = $1 AND password = $2 "#, &email, &password, )
2. 刷新sqlx类型元数据
如果上述修改后仍报错,检查sqlx-data.json是否包含自定义枚举的信息:
- 执行迁移确保数据库结构同步:
cargo sqlx migrate run - 重新生成类型元数据:
cargo sqlx prepare - 清理编译缓存并重新检查:
cargo clean && cargo check
3. 验证枚举派生属性
确认Role枚举的sqlx::Type派生配置正确:
#[derive(Serialize, Deserialize, Debug, sqlx::Type)] #[sqlx(type_name = "role", rename_all = "lowercase")] pub enum Role { ADMIN, USER }
type_name必须与Postgres中创建的枚举名称完全一致(Postgres默认小写,此处已匹配)rename_all = "lowercase"确保Rust枚举变体与数据库枚举值(admin/user)对应
内容的提问来源于stack exchange,提问作者Kanerix
相关产品推荐
相关产品推荐

