[英]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.