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

如何用HoneySQL生成PostgreSQL枚举类型字段的插入SQL?

问题:HoneySQL生成PostgreSQL枚举类型插入SQL的类型匹配问题

表结构与枚举定义

表结构

CREATE TABLE public.item (
id uuid NOT NULL DEFAULT gen_random_uuid(),
"size_type" public."size_type" NULL)

枚举类型定义

CREATE TYPE public."size_type" AS ENUM (
'small',
'medium',
'large');

期望生成的SQL

INSERT INTO item ("size_type") VALUES ('small'::size_type);

当前写法与错误

当前使用的HoneySQL表达式:

{:insert-into :item :values [{:size_type "small"}]}

出现的类型不匹配错误:

"message": "Conflict: Uncaught PSQL exception: ERROR: column "size_type" is of type size_type but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 172",
"psql-error-type": "DATATYPE_MISMATCH"


解决方法

方法1:使用HoneySQL的:cast语法显式转换

直接在字段值中通过:cast指定枚举类型,HoneySQL会生成带类型转换的参数化SQL,兼顾类型正确性与安全性:

{:insert-into :item
 :values [{:size_type [:cast "small" :size_type]}]}

生成的SQL为:

INSERT INTO item ("size_type") VALUES (CAST(? AS size_type));

方法2:使用原生SQL片段(适用于固定/可信输入)

如果需要直接生成带字面量转换的SQL,可通过:raw插入原生片段:

{:insert-into :item
 :values [{:size_type [:raw "'small'::size_type"]}]}

生成的SQL就是你期望的样式:

INSERT INTO item ("size_type") VALUES ('small'::size_type);

注意:此方式若用于外部输入存在SQL注入风险,仅适合固定值或可信场景。

方法3:自定义枚举处理函数(批量场景推荐)

若频繁处理枚举类型,可封装统一的转换函数简化代码:

(require '[honey.sql :as sql])

(defn enum-cast [enum-type value]
  [:cast value enum-type])

;; 使用示例
(sql/format
 {:insert-into :item
  :values [{:size_type (enum-cast :size_type "small")}]})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:42:21