sql – 如何使用Clojure JDBC插入Postgres枚举值?

前端之家收集整理的这篇文章主要介绍了sql – 如何使用Clojure JDBC插入Postgres枚举值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@
例如,这里是Postgresql中的一个产品表,状态为枚举:
create type product_status as enum ('InStock','OutOfStock');

create table product (
    pid            int primary key default nextval('product_pid_seq'),sku            text not null unique,name           text not null,description    text not null,quantity       int not null,cost           numeric(10,2) not null,price          numeric(10,weight         numeric(10,2),status         product_status not null
);

插入产品的典型Clojure代码将是:

(def prod-12345 {:sku "12345"
                 :name "My Product"
                 :description "yada yada yada"
                 :quantity 100
                 :cost 42.00
                 :price 59.00
                 :weight 0.3
                 :status "InStock"})

(sql/with-connection db-spec
   (sql/insert-record :product prod-12345))

但是,status是一个枚举,因此您无法将其作为普通字符串插入,而不将其转换为枚举:

'InStock'::product_status

我知道你可以用一个准备好的声明来做,如:

INSERT INTO product (name,status) VALUES (?,?::product_status)

但是,在没有使用准备好的声明的情况下,是否有办法呢?

解决方法

我今天使用stringtype = unspecified hack解决方法得到了这个工作.

您可以将此参数添加到db-spec中,如下所示:

(def db-spec {:classname "org.postgresql.Driver"
              :subprotocol "postgresql"
              :subname "//myserver:5432/mydatabase"
              :user "myuser"
              :password "mypassword"
              :stringtype "unspecified"}) ; HACK to support enums

然后只需使用insert!照常.

有一个解决方案不会削弱类型安全性是很好的.

猜你在找的MsSQL相关文章