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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:57:17