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

Rust Diesel处理PostgreSQL Jsonb字段时遇类型匹配错误

解决Diesel中Jsonb与serde_json::Value的类型兼容问题

步骤1:启用Diesel的serde_json特性

修改你的Cargo.toml中diesel的依赖配置,添加serde_json特性:

diesel = { version = "2.1.4", features = ["postgres","r2d2", "uuid", "chrono", "serde_json"] }

步骤2:调整User结构体的data字段类型

将data字段的类型改为diesel::pg::types::Jsonb<serde_json::Value>,并通过#[serde(transparent)]让serde直接处理内部的JSON值:

use crate::schema::user;
use diesel::prelude::*;
use diesel::pg::types::Jsonb;
use serde::{Deserialize, Serialize};
use uuid::Uuid;

#[derive(Serialize, Deserialize, Queryable, Insertable)]
#[table_name = "user"]
pub struct User {
    pub id: Uuid,
    #[serde(transparent)]
    pub data: Jsonb<serde_json::Value>,
    // 其他字段...
}

原理说明

  • Diesel默认未为serde_json::Value实现PostgreSQL Jsonb类型对应的数据库交互trait(比如Expression、Queryable、Insertable所需的相关trait),启用serde_json特性后,Diesel会自动提供这些实现。
  • 使用Jsonb<serde_json::Value>作为字段类型,能让Diesel正确识别这是PostgreSQL的Jsonb类型;#[serde(transparent)]则让serde在序列化/反序列化User结构体时,直接操作内部的serde_json::Value,无需额外处理Jsonb包装器。

可选简化(若无需直接操作Jsonb包装器)

如果希望代码中直接使用serde_json::Value而不用Jsonb包裹,确保启用serde_json特性后,导入Diesel的JSON相关trait:

use diesel::pg::types::jsonb::JsonbExpressionMethods;

不过这种方式在部分查询场景下需要额外处理,推荐优先使用前面的Jsonb<serde_json::Value>方案,类型映射更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:08:33