例如,这里是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!照常.
有一个解决方案不会削弱类型安全性是很好的.