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

