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

Diesel框架下Account结构体Queryable trait绑定错误求助

问题解决:Diesel插入后get_result的Queryable trait绑定错误

问题重现

SQL迁移脚本

CREATE TABLE accounts (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users(id),
    name VARCHAR NOT NULL,
    currency VARCHAR NOT NULL,
    account_type VARCHAR NOT NULL,
    amount DOUBLE PRECISION NOT NULL
);

生成的Diesel Schema

diesel::table! {
    use diesel::sql_types::*;

    accounts (id) {
        id -> Uuid,
        user_id -> Uuid,
        name -> Varchar,
        currency -> Varchar,
        account_type -> Varchar,
        amount -> Float8,
    }
}

Account结构体定义

#[derive(Debug, Serialize, Deserialize, Clone, Queryable, PartialEq)]
#[diesel(belongs_to(User, foreign_key = user_id))]
#[diesel(table_name = accounts)]
pub struct Account {
    id: Uuid,
    user_id: Uuid,
    name: String,
    currency: String,
    account_type: String,
    amount: f64,
    created_date: DateTime<Utc>,
}

插入操作代码

let new_account = diesel::insert_into(accounts::table)
            .values(&account_data)
            .get_result::<Account>(&mut db.pool.get().unwrap())
            .map_err(|_| "Failed to create account".to_string());

报错信息

the trait bound `(uuid::Uuid, uuid::Uuid, std::string::String, std::string::String, std::string::String, f64, chrono::DateTime<Utc>): diesel::Queryable<(diesel::sql_types::Uuid, diesel::sql_types::Uuid, diesel::sql_types::Text, diesel::sql_types::Text, diesel::sql_types::Text, Double), _>` is not satisfied
the following other types implement trait `diesel::Queryable<ST, DB>`:
<(std::collections::Bound<T>, std::collections::Bound<T>) as diesel::Queryable<diesel::sql_types::Range<ST>, Pg>>
<(A,) as diesel::Queryable<Record<(SA,)>, Pg>>
<(A,) as diesel::Queryable<(SA,), __DB>>
<(A, B) as diesel::Queryable<Record<(SA, SB)>, Pg>>
<(A, B) as diesel::Queryable<(SA, SB), __DB>>
<(A, B, C) as diesel::Queryable<Record<(SA, SB, SC)>, Pg>>
<(A, B, C) as diesel::Queryable<(SA, SB, SC), __DB>>
<(A, B, C, D) as diesel::Queryable<Record<(SA, SB, SC, SD)>, Pg>>
and 57 others
required for `InsertStatement<table, ValuesClause<(ColumnInsertValue<user_id, Bound<Uuid, &...>>, ..., ..., ..., ...), ...>>` to implement `LoadQuery<_, Account>`

错误原因

Account结构体中定义了created_date字段,但该字段既不存在于数据库表的SQL定义中,也未出现在Diesel自动生成的schema里。执行get_result::<Account>时,数据库返回的是表中6个字段的数据,但结构体期望映射7个字段,导致Queryable trait无法完成类型匹配,触发绑定错误。

解决方案

方案1:添加created_date字段到数据库

如果业务逻辑确实需要记录创建时间,按以下步骤修改:

  1. 更新SQL迁移脚本,添加created_date列:
CREATE TABLE accounts (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID NOT NULL REFERENCES users(id),
    name VARCHAR NOT NULL,
    currency VARCHAR NOT NULL,
    account_type VARCHAR NOT NULL,
    amount DOUBLE PRECISION NOT NULL,
    created_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP
);
  1. 重新生成Diesel Schema:
    运行diesel migration run执行迁移,再通过diesel print-schema更新schema文件,此时schema会新增created_date -> Timestamptz字段。
  2. 确认结构体类型匹配:
    结构体中的DateTime<Utc>与Diesel的Timestamptz类型兼容,无需修改结构体。

方案2:移除结构体中的created_date字段

如果不需要该字段,直接删除Account结构体里的created_date: DateTime<Utc>行,确保结构体字段与数据库表、schema完全对应:

#[derive(Debug, Serialize, Deserialize, Clone, Queryable, PartialEq)]
#[diesel(belongs_to(User, foreign_key = user_id))]
#[diesel(table_name = accounts)]
pub struct Account {
    id: Uuid,
    user_id: Uuid,
    name: String,
    currency: String,
    account_type: String,
    amount: f64,
}

完成上述修改后,重新编译代码,插入操作的get_result即可正常工作。

内容的提问来源于stack exchange,提问作者tydusgg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:45:19