gpt4 book ai didi

rust - SQLx的通用特性和引用

转载 作者:行者123 更新时间:2023-12-03 11:38:40 24 4
gpt4 key购买 nike

我已经创建了一个通用特征,并且正在sqlx查询中实现它,但是出现错误
我究竟做错了什么?

#[async_trait]
pub trait ITodoRepo<P> {
async fn list(pool:&P) -> Result<Vec<TodoType>>;

}
pub struct TodoRepo;
#[async_trait]
impl<P: sqlx::Executor<'static, Database = sqlx::Postgres>> ITodoRepo<P> for TodoRepo {
async fn list(pool: &P) -> Result<Vec<TodoType>> {
let rowset = sqlx::query_as!(
TodoSchema,
r#"SELECT * FROM todo"#)
.fetch_all(pool)
.await?
.iter()
.map(|row| hydrate(row))
.collect();

Ok(rowset)
}
}

如何执行执行器?
error[E0637]: `'_` cannot be used here
--> src/todo.rs:21:24
|
21 | .fetch_all(pool)
| ^^^^ the trait `sqlx::Executor<'_>` is not implemented for `&P`

最佳答案

在您的问题中,按照fn list(pool: &P)pool的类型为&P。但是fetch_all()方法似乎需要一个实现trait sqlx::Executor<'_>的参数。 P根据您的展示实现了该特征,但&P却没有。
这是您的问题的最小可重复代码:

trait MyTrait {}

struct MyStruct;

impl MyTrait for MyStruct {}

fn func<T: MyTrait>(arg: T) {
todo!()
}

fn main() {
let var = MyStruct;
let ref_to_var = &var;
func(ref_to_var);
}
Playground
基本上,您的函数需要一个实现某些特征 TMyTrait类型,但是您要传递 &T
要解决此问题,您可以更改功能以接受引用。就像上面的例子一样:
fn func<T: MyTrait>(arg: &T) {
todo!()
}
Playground
或者,您可以为引用本身实现特征:
impl MyTrait for &MyStruct {}
Playground

关于rust - SQLx的通用特性和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65030533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com