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

SQLX存入枚举向量至数据库报错:unsupported type _weekday的解决方法

解决SQLX插入PostgreSQL枚举数组报错问题

1. 确保Rust枚举与PostgreSQL枚举正确映射

首先,你的Rust枚举必须正确实现SQLX的Type、Encode、Decode trait,并且指定与PostgreSQL完全一致的枚举类型名:

PostgreSQL枚举定义示例

CREATE TYPE weekday AS ENUM ('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday');

对应的Rust枚举实现

use sqlx::{Decode, Encode, Type};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Type, Encode, Decode)]
#[sqlx(type_name = "weekday")] // 必须和PostgreSQL枚举名完全匹配(注意大小写)
#[sqlx(rename_all = "lowercase")] // 匹配PostgreSQL枚举值的大小写
enum Weekday {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday,
}

2. 插入枚举数组的正确姿势

SQLX对PostgreSQL枚举数组的支持需要用PgArray包装Vec<Weekday>,不需要手动加as "weekday: weekday"(这是错误语法)。

使用query!宏的写法

use sqlx::postgres::{PgArray, PgPool};

async fn insert_task(weekdays: Vec<Weekday>, db: &PgPool) -> Result<(), sqlx::Error> {
    sqlx::query!(
        r#"
        INSERT INTO tasks (weekdays)
        VALUES ($1)
        "#,
        PgArray::from(weekdays) as _
    )
    .execute(db)
    .await?;
    Ok(())
}

使用普通query的写法

如果不想用query!宏,也可以直接用query配合bind:

use sqlx::postgres::{PgArray, PgPool};

async fn insert_task(weekdays: Vec<Weekday>, db: &PgPool) -> Result<(), sqlx::Error> {
    sqlx::query("INSERT INTO tasks (weekdays) VALUES ($1)")
        .bind(PgArray::from(weekdays))
        .execute(db)
        .await?;
    Ok(())
}

3. 常见错误排查

  • 枚举名不匹配:检查#[sqlx(type_name)]的值是否和PostgreSQL中的枚举名完全一致(PostgreSQL默认区分大小写,若创建枚举时未加引号,名称会被转为小写)。
  • 枚举值大小写不匹配:如果PostgreSQL枚举值是小写,Rust枚举需要加#[sqlx(rename_all = "lowercase")]来映射,反之亦然。
  • SQLX版本过旧:确保使用最新版的SQLX,旧版本对枚举数组的支持存在缺陷。
  • 表定义错误:确认tasks表中的weekdays字段类型是weekday[](枚举数组类型),而非普通枚举类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:12:39