Rust 未为'diesel::query\u builder::SelectStatement<;实现特性'Table'&燃气轮机;
我正试图为一个使用Diesel的Rust项目编写一些样板功能。之前有人警告过我,柴油机的通用编程非常困难,但是我现在遇到的错误让我抓狂 以下代码:Rust 未为'diesel::query\u builder::SelectStatement<;实现特性'Table'&燃气轮机;,rust,rust-diesel,Rust,Rust Diesel,我正试图为一个使用Diesel的Rust项目编写一些样板功能。之前有人警告过我,柴油机的通用编程非常困难,但是我现在遇到的错误让我抓狂 以下代码: use std::marker::PhantomData; use anyhow::anyhow; use diesel::{associations::HasTable, dsl::{Find, Limit}, OptionalExtension, PgConnection, query_dsl::{LoadQuery, metho
use std::marker::PhantomData;
use anyhow::anyhow;
use diesel::{associations::HasTable, dsl::{Find, Limit},
OptionalExtension, PgConnection,
query_dsl::{LoadQuery, methods::{FindDsl, LimitDsl}},
RunQueryDsl, Table,
};
use diesel::query_builder::InsertStatement;
use diesel::query_dsl::methods::ExecuteDsl;
use crate::db::POOL;
use crate::kite::KiteEntity;
use crate::schema::kites;
pub struct Repository<Entity, Tab> {
_entity_phantom: PhantomData<Entity>,
_table_phantom: PhantomData<Tab>,
}
impl<Entity, Tab> Repository<Entity, Tab>
where
Entity: HasTable<Table = Tab>,
Tab: Table,
{
pub fn new() -> Self {
Repository {
_entity_phantom: PhantomData::default(),
_table_phantom: PhantomData::default(),
}
}
pub fn find_by_id(&self, id: i64, conn: &PgConnection) -> anyhow::Result<Option<Entity>>
where
Tab: LimitDsl + FindDsl<i64>,
Find<Tab, i64>: LimitDsl + Table,
Limit<Find<Tab, i64>>: LoadQuery<PgConnection, Entity>,
{
match Entity::table().find(id).first::<Entity>(conn).optional() {
Ok(entity) => Ok(entity),
Err(e) => Err(anyhow!("{}", e)),
}
}
}
fn main() {
let repo: Repository<KiteEntity, kites::table> = Repository::new();
repo.find_by_id(1, &POOL.get()?);
}
使用std::marker::PhantomData;
使用anyhow::anyhow;
使用diesel::{associations::HasTable,dsl::{Find,Limit},
可选扩展,PG连接,
query_dsl::{LoadQuery,methods:{FindDsl,LimitDsl},
RunQueryDsl,表格,
};
使用diesel::query_builder::InsertStatement;
使用diesel::query_dsl::methods::ExecuteSL;
使用板条箱::db::池;
使用板条箱::风筝::风筝;
使用板条箱::模式::风筝;
发布结构存储库{
_实体_幻影:幻影数据,
_表_幻影:幻影数据,
}
impl存储库
哪里
实体:HasTable,
选项卡:表格,
{
pub fn new()->Self{
存储库{
_实体_幻影:幻影数据::默认值(),
_表_phantom:PhantomData::default(),
}
}
pub fn find_by_id(&self,id:i64,conn:&PgConnection)->无论如何::Result
哪里
标签:LimitDsl+FindDsl,
查找:LimitDsl+表,
限制:LoadQuery,
{
匹配实体::表().find(id).first::(conn.optional()){
正常(实体)=>正常(实体),
Err(e)=>Err(无论如何!(“{}”,e)),
}
}
}
fn main(){
让repo:Repository=Repository::new();
repo.find_by_id(1,&POOL.get()?);
}
给我一个错误:
error[E0277]: the trait bound `diesel::query_builder::SelectStatement<kites::table, query_builder::select_clause::DefaultSelectClause, query_builder::distinct_clause::NoDistinctClause, query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<kites::columns::id, diesel::expression::bound::Bound<BigInt, i64>>>>: Table` is not satisfied
--> domain/src/main.rs:47:14
|
47 | repo.find_by_id(id, &POOL.get()?)
| ^^^^^^^^^^ the trait `Table` is not implemented for `diesel::query_builder::SelectStatement<kites::table, query_builder::select_clause::DefaultSelectClause, query_builder::distinct_clause::NoDistinctClause, query_builder::where_clause::WhereClause<diesel::expression::operators::Eq<kites::columns::id, diesel::expression::bound::Bound<BigInt, i64>>>>`
error[E0277]:特性绑定'diesel::query\u builder::SelectStatement:Table'不满足
-->domain/src/main.rs:47:14
|
47 | repo.find_by_id(id,&POOL.get()?)
|^^^^^^^^^^未为“diesel::query\u builder::SelectStatement”实现trait“Table”`
我确信我对KiteEntity(Queryable、Insertable、PartialEq、Debug、Identification
)有正确的派生,并且导入的crate::schema::kites
直接来自diesel生成的代码
所以现在我有点迷路了。如果您有任何意见,我们将不胜感激:)对我来说,这看起来像是这个问题的重复:因为@user1870238也提出了这个问题,他们可能会澄清为什么这是相关的。否则,
Find:LimitDsl+表
绑定显然对我来说是错误的<代码>表格是绝对错误的,因为Find
(一个聪明的SelectStatement
类型定义)没有实现表格
。