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字段到数据库
如果业务逻辑确实需要记录创建时间,按以下步骤修改:
- 更新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 );
- 重新生成Diesel Schema:
运行diesel migration run执行迁移,再通过diesel print-schema更新schema文件,此时schema会新增created_date -> Timestamptz字段。 - 确认结构体类型匹配:
结构体中的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
相关产品推荐
相关产品推荐

