Rust 未为'diesel::query\u builder::SelectStatement<;实现特性'Table'&燃气轮机;

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

我正试图为一个使用Diesel的Rust项目编写一些样板功能。之前有人警告过我,柴油机的通用编程非常困难,但是我现在遇到的错误让我抓狂

以下代码:

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
类型定义)没有实现
表格