繁体   English   中英

无法在 rust 柴油机中使用通用参数实现特征

[英]Cannot implement trait with generic param in rust diesel

我定义了一个名为exists_by_id_and_password的特征。 我不想用具体的数据库后端来实现它,所以一些通用参数被添加到DB结构中。 但是编译器报错:

type mismatch resolving `<C as Connection>::Backend == Pg`
expected type parameter `B`
           found struct `Pg`
required because of the requirements on the impl of `LoadQuery<C, bool>` for `diesel::query_builder::SelectStatement<(), query_builder::select_clause::SelectClause<Exists<diesel::query_builder::SelectStatement<table, query_builder::select_clause::DefaultSelectClause, query_builder::distinct_clause::NoDistinctClause, query_builder::where_clause::WhereClause<And<diesel::expression::operators::Eq<columns::username, diesel::expression::bound::Bound<diesel::sql_types::Text, std::string::String>>, diesel::expression::operators::Eq<columns::password, diesel::expression::bound::Bound<diesel::sql_types::Text, std::string::String>>>>>>>>`

奇怪的是错误提到Pg ,我认为它是由柴油生成的模式引起的,因为我的代码中没有任何与 postgres 相关的代码,除了cargo.toml ,我使用features=["postgres"]导入柴油features=["postgres"]

下面是我的代码:

use diesel::select;
    
use crate::authenticator::AuthDB;
use crate::diesel::dsl::exists;
use crate::diesel::prelude::*;
use crate::schema::users;
    
pub struct DB<C, B>
where
    C: diesel::Connection<Backend = B>,
    B: diesel::backend::Backend,
{
    conn: C,
}
    
impl<C, B> AuthDB for DB<C, B>
where
    C: diesel::Connection<Backend = B>,
    B: diesel::backend::Backend + diesel::sql_types::HasSqlType<diesel::sql_types::Bool>,
{
    fn exists_by_id_and_password(
        &self,
        id: String,
        password: String,
    ) -> Result<bool, crate::error::Error> {
        Ok(select(exists(
            users::dsl::users.filter(
                users::dsl::username
                    .eq(id)
                    .and(users::dsl::password.eq(password)),
            ),
        ))
        .get_result::<bool>(&self.conn)?)
    }
}

我想知道,可以在没有具体后端类型的情况下实现特征

问题是当你写这个impl

impl<C, B> AuthDB for DB<C, B>
where
    C: diesel::Connection<Backend = B>,
    B: diesel::backend::Backend + diesel::sql_types::HasSqlType<diesel::sql_types::Bool>,
{

您是在告诉 Rust “嘿,我将以适用于任何后端的方式实现此特征”。 但是然后你在内部使用它来实现它

users::dsl::users.filter(
    users::dsl::username
        .eq(id)
        .and(users::dsl::password.eq(password)),
)

我有根据的猜测是,当您指定features = ["postgres"]时,Diesel 会生成其中一种类型/函数以在其键入时明确引用 Postgres(我无法检查,因为您没有包含它们的定义)。 这会导致 Rust 抱怨,因为您承诺为所有后端实现该特征,但随后在正文中使用 Postgres 特定工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM