Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 当尝试使用Diesel查询时,评估需求`:Sized`的溢出_Rust_Rust Diesel - Fatal编程技术网

Rust 当尝试使用Diesel查询时,评估需求`:Sized`的溢出

Rust 当尝试使用Diesel查询时,评估需求`:Sized`的溢出,rust,rust-diesel,Rust,Rust Diesel,我正在尝试为我正在构建的应用程序松散地实现存储库模式,但是我似乎偶然发现了某种递归类型定义 关于以下代码: usediesel::{pg::pg,Insertable,Queryable,QueryDsl,PgConnection,Identifiable,Table}; 使用std::marker::PhantomData; 使用anyhow::anyhow; 发布结构存储库{ _实体_幻影:幻影数据, _类型_幻影:幻影数据, 表:选项卡, } impl存储库 哪里 实体:可查询+可插入+可

我正在尝试为我正在构建的应用程序松散地实现存储库模式,但是我似乎偶然发现了某种递归类型定义

关于以下代码:

usediesel::{pg::pg,Insertable,Queryable,QueryDsl,PgConnection,Identifiable,Table};
使用std::marker::PhantomData;
使用anyhow::anyhow;
发布结构存储库{
_实体_幻影:幻影数据,
_类型_幻影:幻影数据,
表:选项卡,
}
impl存储库
哪里
实体:可查询+可插入+可识别,
选项卡:表格
{
fn通过\u id(&self,id:i64,conn:&PgConnection)->无论如何::Result查找\u{
匹配self.table.find(id).first::(conn){
正常(实体)=>正常(实体),
Err(e)=>Err(无论如何!(“{}”,e)),
}
}
}
我得到一个错误:

error[E0275]: overflow evaluating the requirement `_: Sized`
  --> support/src/lib.rs:18:26
   |
18 |         match self.table.find(id).first::<Entity>(conn) {
   |                          ^^^^
   |
   = help: consider adding a `#![recursion_limit="256"]` attribute to your crate (`support`)
   = note: required because of the requirements on the impl of `FilterDsl<_>` for `<Tab as AsQuery>::Query`
错误[E0275]:评估需求溢出`\u275:大小`
-->support/src/lib.rs:18:26
|
18 |匹配self.table.find(id.first::(康涅狄格州){
|                          ^^^^
|
=帮助:考虑向您的装箱(“支持”)添加一个“*![递归递归限制=256”]属性。
=注意:由于“::查询”的“FilterDsl”impl上的要求,因此需要`
我已经尝试在板条箱的顶部增加递归限制,但没有效果。在trait边界上到处Sprinking
+size
,似乎没有任何效果


我遗漏了什么?

像这样的错误通常意味着
diesel
无法解析你的特质界限,因为限制不够

Diesel泛型编程通常有点复杂,但下面有一些技巧可以在下次遇到此错误时帮助您:

  • 无论何时,如果您想使用特定的方法,如
    find
    ,您必须确保也检查相同的边界
  • 更倾向于构建特定的可重用函数片段,以允许您获得所需的功能
  • 每次调用diesel方法时,您都在“包装”一个新语句,必须绑定这个新语句,否则您将收到奇怪的错误消息,如您的问题中所示
  • 这些方法的结果通常有一个速记,如下面代码中的
    Find
    Limit
  • 正如您在第27行所看到的,我们必须嵌套
    Limit
    ,对于您在查询链中调用的每个新方法,您都需要指定它
使用anyhow::anyhow;
使用柴油:{
关联::HasTable,
dsl::{Find,Limit},
查询dsl::{
方法:{FindDsl,LimitDsl},
LoadQuery,
},
PgConnection,RunQueryDsl,表,
};
使用std::marker::PhantomData;
发布结构存储库{
_实体_幻影:幻影数据,
_表_幻影:幻影数据,
}
impl存储库
哪里
实体:HasTable,
选项卡:表格,
{
fn通过\u id(&self,id:i64,conn:&PgConnection)->无论如何::Result查找\u
哪里
标签:LimitDsl+FindDsl,
查找:LimitDsl+表,
限制:LoadQuery,
{
匹配实体::表()。查找(id)。第一个::(conn){
正常(实体)=>正常(实体),
Err(e)=>Err(无论如何!(“{}”,e)),
}
}
}
我错过了什么

一般来说,人们可以猜到你在试图做什么,我不认为你没有达到预期结果是你的错。这种泛型编程很难理解,所有类型及其名称
t
U
,很容易迷路

  • 如果我正确理解了
    实体
    所指的内容,那么你绑定在
    实体
    上的特质是错误的:
    • Queryable
      表示可以通过
      Query
      数据库中查询它所实现的类型。如果您也不传入具体类型,“传入”类型
      SqlQuery
      是没有意义的
  • Insertable
    我想是其他方法的遗留问题吧
  • 也可识别

这是一个多么有洞察力的回答,非常感谢!:D