如何在Diesel中基于复合类型内的值进行过滤?
在Diesel中对PostgreSQL复合类型的字段进行过滤
完全可以实现基于复合类型内部字段的过滤,不需要加载整张表再做内存过滤。下面是两种可行的实现方式:
方法一:使用Diesel内置的复合类型字段访问函数
PostgreSQL中访问复合类型字段的语法是(column).field_name,Diesel为PostgreSQL提供了field函数来构造这类表达式。
修改后的代码
首先导入对应的模块:
use diesel::pg::expression::dsl::field;
然后调整查询函数:
fn get_all_of_type(id: i32, conn: &mut PgConnection) -> Vec<InventoryId> { use schema::inventory; inventory::table .filter(field(inventory::item_id, "item_type").eq(id)) .select(inventory::item_id) .load(conn) .unwrap() }
方法二:使用sql宏直接构造原生SQL表达式
如果更习惯原生SQL的写法,可以用sql宏直接写出复合字段的过滤逻辑:
use diesel::dsl::sql; fn get_all_of_type(id: i32, conn: &mut PgConnection) -> Vec<InventoryId> { use schema::inventory; inventory::table .filter(sql!("(item_id).item_type = {}", id)) .select(inventory::item_id) .load(conn) .unwrap() }
为什么之前的写法失败
Diesel自动生成的schema文件不会为自定义复合类型的内部字段生成对应的访问器(比如inventory::item_id.item_type这类写法不存在),所以需要手动构造针对复合字段的过滤表达式。
内容的提问来源于stack exchange,提问作者knickish
相关产品推荐
相关产品推荐

