结构实现diesel::Queryable 特性所必需的

问题描述 投票:0回答:1

我有一个针对帐户实体的 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::table! {
    use diesel::sql_types::*;

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

这是结构本身:

#[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());

我在传递 db.poll 到 get_result 方法中看到以下错误:

不满足特质界限

(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), _>
以下其他类型实现了特质
diesel::Queryable<ST, DB>
: <(std::collections::Bound,std::collections::Bound) 作为柴油::Queryable,Pg>> <(A,) as diesel::Queryable,PG>> <(A,) as diesel::Queryable<(SA,), __DB>> <(A, B) as diesel::Queryable,PG>> <(A, B) as diesel::Queryable<(SA, SB), __DB>> <(A, B, C) as diesel::Queryable,PG>> <(A, B, C) as diesel::Queryable<(SA, SB, SC), __DB>> <(A, B, C, D) as diesel::Queryable,PG>> 和其他 57 人 需要
InsertStatement<table, ValuesClause<(ColumnInsertValue<user_id, Bound<Uuid, &...>>, ..., ..., ..., ...), ...>>
才能实施
LoadQuery<_, Account>

显然我无法删除可查询特征,因为它必须与柴油一起使用。

postgresql rust rust-diesel
1个回答
0
投票

这本质上是此列表中的第一个错误消息。这是您的查询返回的内容与您的结构期望查询返回的内容不匹配。该信息只能在您实际执行查询的地方解析。

您可以通过在结构体上使用

#[derive(Selectable)]
+
#[diesel(check_for_backend(diesel::pg::Pg))]
并在查询中使用
.select(YourType::as_select())
来防止发生此类错误。

© www.soinside.com 2019 - 2024. All rights reserved.