You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:31:54