You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用diesel和juniper插入数据时出现奇怪错误该如何解决?

问题原因

你的create_contraption函数返回值类型是FieldResult<Contraption>,等价于Result<Contraption, FieldError>,但你在get_result后调用了expect:

  • expect会直接消费Result,成功时返回Contraption实例,失败时直接触发线程panic,不会返回Result类型,和你函数声明的返回类型不匹配
  • 编译器无法匹配返回值类型,就会错误地尝试为Result类型实现Queryable trait,进而抛出你看到的错误

修复方案

不要用expect处理diesel的返回结果,而是将diesel的错误转换为FieldError后,用?操作符向上传播错误,刚好匹配你函数的返回类型:

impl MutationRoot {
    fn create_contraption(
        context: &Context,
        new_contraption: ContraptionInput,
    ) -> FieldResult<Contraption> {
        use crate::schema::contraptions;

        let conn = context.dbpool.get().map_err(|_| {
            FieldError::new("Could not open connection to the database", Value::null())
        })?;

        Ok(diesel::insert_into(contraptions::table)
            .values(&new_contraption)
            .get_result(&conn)
            .map_err(|e| FieldError::new(format!("Could not create new contraptions: {}", e), Value::null()))?)
    }
}

如果你仅在开发阶段测试,想要插入失败时直接panic,也可以把expect后的结果用Ok包裹,匹配返回类型即可:

Ok(
    diesel::insert_into(contraptions::table)
        .values(&new_contraption)
        .get_result(&conn)
        .expect("Could not create new contraptions")
)

内容的提问来源于stack exchange,提问作者TOOL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:51:00