如何在sqlx中重命名枚举值适配PostgreSQL的CHAR字段?
解决方案
你的需求完全可以实现,报错原因是sqlx默认会将带有#[derive(sqlx::Type)]的Rust枚举识别为PostgreSQL的自定义枚举类型(即需要提前用CREATE TYPE创建的枚举),但你的chats.type字段是普通的CHAR(1)类型,数据库中不存在名为chattype的自定义枚举,因此触发错误。
只需在枚举上添加#[sqlx(type_name = "char")]属性,明确告诉sqlx将该枚举映射到PostgreSQL的CHAR类型,而非自定义枚举,同时保留每个变体的rename属性即可:
#[derive(sqlx::Type, Debug, Serialize, Deserialize)] #[sqlx(type_name = "char")] // 指定数据库字段类型为CHAR pub enum ChatType { #[sqlx(rename="p")] Personal, #[sqlx(rename="g")] Group, #[sqlx(rename="b")] Broadcast, #[sqlx(rename="s")] Service, }
说明
#[sqlx(type_name = "char")]:强制sqlx将枚举序列/反序列化为PostgreSQL的字符类型,而非尝试使用自定义枚举类型- 每个变体的
#[sqlx(rename)]:确保枚举变体与数据库中存储的单个字符一一对应 - 配置完成后,你可以在代码中直接使用
ChatType::Personal这类语义化名称,sqlx会自动处理与CHAR(1)字段的转换
内容的提问来源于stack exchange,提问作者jpenna
相关产品推荐
相关产品推荐

