Rust使用Diesel时行删除函数的正确返回类型
解决Diesel中
hard_delete函数返回类型的私有模块问题 你的问题出在直接引用了Diesel内部私有模块的类型query_builder::where_clause::WhereClause,这个类型并未对外暴露,因此无法作为公共函数的返回类型使用。
正确的返回类型写法
有两种常用的解决方案:
1. 使用impl Trait隐藏具体类型(推荐)
利用Rust的impl Trait特性,直接声明函数返回实现了执行所需trait的类型,既简洁又避免依赖私有内部类型:
use diesel::mysql::MysqlConnection; use diesel::query_dsl::RunQueryDsl; // ... 其他代码 ... pub fn hard_delete(&self) -> impl RunQueryDsl<MysqlConnection> { diesel::delete(dataitems::table).filter(dataitems::id.eq(self.id)) }
RunQueryDsl trait包含了执行数据库操作的核心方法(比如execute),完全满足后续执行删除语句的需求。
2. 使用公共暴露的DSL类型
如果需要明确写出具体类型,可以使用Diesel对外暴露的DSL类型组合:
pub fn hard_delete(&self) -> diesel::dsl::Delete< dataitems::table, diesel::dsl::Filter< diesel::dsl::DeleteTarget<dataitems::table>, diesel::dsl::Eq<dataitems::id, Uuid> > > { diesel::delete(dataitems::table).filter(dataitems::id.eq(self.id)) }
这种写法虽然精确,但代码冗长,不如impl Trait简洁易维护。
核心原因
Diesel将很多内部实现细节(比如WhereClause)设为私有,目的是封装内部逻辑,避免用户依赖不稳定的内部结构。使用公共trait或对外暴露的DSL类型,才能保证代码的兼容性和稳定性。
内容的提问来源于stack exchange,提问作者raltm2e
相关产品推荐
相关产品推荐

