Rust使用query_as!查询RegistrationKeys时出现字段缺失错误的问题
问题解决:
RegistrationKeys初始化缺少registration_key字段 问题根源
你用query_as!将查询结果映射到RegistrationKeys结构体,但该结构体要求必须包含id和registration_key两个字段,而你的SQL语句只查询了id,导致ORM无法创建完整的结构体实例,因此抛出缺少字段的错误。
解决方案
方案1:修改SQL,查询结构体所需的所有字段
既然结构体需要id和registration_key两个字段,直接在SELECT语句中同时选中这两个字段,查询结果就能完整填充结构体:
let registration_key = String::from("ABCD"); let response = query_as!( RegistrationKeys, "SELECT id, registration_key FROM RegistrationKeys WHERE registration_key = $1", registration_key ) .fetch_one(&pool) .await;
方案2:定义仅包含所需字段的结构体
如果你的需求只是获取id字段,没必要使用完整的RegistrationKeys结构体,可以新建一个精简版结构体:
#[derive(Debug, sqlx::FromRow)] pub struct RegistrationKeyId { pub id: i64, } // 使用新结构体执行查询 let registration_key = String::from("ABCD"); let response = query_as!( RegistrationKeyId, "SELECT id FROM RegistrationKeys WHERE registration_key = $1", registration_key ) .fetch_one(&pool) .await;
注意要给新结构体添加#[derive(sqlx::FromRow)]注解,这样sqlx才能正确完成查询结果的映射。
方案3:使用query!直接获取单个字段
如果连新结构体都不想定义,可以用query!直接返回字段值,无需映射到结构体:
let registration_key = String::from("ABCD"); let result = query!( "SELECT id FROM RegistrationKeys WHERE registration_key = $1", registration_key ) .fetch_one(&pool) .await; // 从结果中提取id match result { Ok(row) => { let id: i64 = row.id; // 后续处理id逻辑 } Err(e) => { // 错误处理逻辑 } }
内容的提问来源于stack exchange,提问作者Mickers
相关产品推荐
相关产品推荐

