使用diesel和juniper插入数据时出现奇怪错误该如何解决?
问题原因
你的create_contraption函数返回值类型是FieldResult<Contraption>,等价于Result<Contraption, FieldError>,但你在get_result后调用了expect:
expect会直接消费Result,成功时返回Contraption实例,失败时直接触发线程panic,不会返回Result类型,和你函数声明的返回类型不匹配- 编译器无法匹配返回值类型,就会错误地尝试为
Result类型实现Queryabletrait,进而抛出你看到的错误
修复方案
不要用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
相关产品推荐
相关产品推荐

