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
相关产品推荐
相关产品推荐

