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

如何为Rust枚举类型实现tokio_postgres::types::ToSql trait

实现 tokio_postgres::types::ToSql 用于 Rust 与 PostgreSQL 枚举映射

下面是针对你的枚举类型完成 ToSql trait 实现的完整方案,包含核心逻辑和关键说明:

完整实现代码

use tokio_postgres::types::{ToSql, Type, IsNull};
use bytes::BytesMut;
use std::error::Error;

#[derive(Debug)]
enum Flag {
    MyFlag1,
    MyFlag2,
    MyFlag3,
}

impl ToSql for Flag {
    fn to_sql(&self, ty: &Type, out: &mut BytesMut) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
        // 校验传入的PostgreSQL类型是否为目标枚举
        if ty.name() != "flag" {
            return Err(format!("预期类型为flag,实际收到{}", ty).into());
        }

        // 将Rust枚举变体映射到PostgreSQL对应的枚举字符串
        let enum_str = match self {
            Flag::MyFlag1 => "my_flag_1",
            Flag::MyFlag2 => "my_flag_2",
            Flag::MyFlag3 => "my_flag_3",
        };

        // 将字符串字节写入输出缓冲区,PostgreSQL枚举默认以文本格式传输
        out.extend_from_slice(enum_str.as_bytes());
        Ok(IsNull::No)
    }

    fn accepts(ty: &Type) -> bool {
        // 仅匹配PostgreSQL中定义的flag枚举类型
        ty.name() == "flag"
    }
}

关键细节说明

  • to_sql 方法:
    • 先做类型校验,确保当前操作的是PostgreSQL中定义的flag枚举,避免类型不匹配导致的错误。
    • 通过match完成Rust枚举到PostgreSQL枚举字符串的映射,严格对应数据库中定义的枚举值格式。
    • 将映射后的字符串字节写入输出缓冲区,PostgreSQL枚举类型默认采用文本格式传输。
  • accepts 方法:
    直接对比PostgreSQL类型的名称是否为flag,确保只有目标枚举类型会触发这个实现。

额外提示

如果需要从PostgreSQL读取枚举值到Rust,只需反向实现 FromSql trait,把数据库返回的字符串映射回Rust枚举变体即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:50:24