在Clojure中,我如何使一个生成SQL的HoneySQL查询在具有和enum类型的表字段中插入值?



让我们以在postgres中创建的表为例:

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');

我想做的是用HoneySQL生成以下SQL查询,用于将值'small'插入到"size_type"项表的字段

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

我正在使用这种方法:

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

但是我得到这个不匹配错误:

message": "Conflict: Uncaught PSQL exception: ERROR: column "size_type"是size_type类型,但表达式是字符类型变化的n提示:您需要重写或转换表达式。n位置:172";"psql-error-type"DATATYPE_MISMATCH">

正如Eugene在他的评论中所说,您需要的是:cast—这里有一些可能的方法,显示了在每种情况下将生成的SQL:

user=> (require '[honey.sql :as sql])
nil
user=> (sql/format {:insert-into :item :values [{:size_type [:cast "small" :size_type]}]})
["INSERT INTO item (size_type) VALUES (CAST(? AS SIZE_TYPE))" "small"]
user=> (sql/format {:insert-into :item :values [{:size_type [:cast "small" :public.size_type]}]})
["INSERT INTO item (size_type) VALUES (CAST(? AS PUBLIC.SIZE_TYPE))" "small"]
user=> (sql/format {:insert-into :item :values [{:size_type [:cast "small" :'public.size_type]}]})
["INSERT INTO item (size_type) VALUES (CAST(? AS public.size_type))" "small"]
user=> (sql/format {:insert-into :item :values [{:size_type [:cast [:inline "small"] :'public.size_type]}]})
["INSERT INTO item (size_type) VALUES (CAST('small' AS public.size_type))"]
user=>

相关内容

  • 没有找到相关文章

最新更新