2013-02-05 21 views
13

उदाहरण के लिए, यहाँ एक enum के रूप में स्थिति के साथ 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,2) not null, 
    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 ताकि आप एक enum है इसे एक enum पर कास्टिंग किए बिना इसे सामान्य स्ट्रिंग के रूप में नहीं डाला जा सकता:

'InStock'::product_status 

मुझे पता है कि आप इसे तैयार राज्य के साथ कर सकते हैं ment, जैसे:

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

लेकिन क्या तैयार वक्तव्य के बिना इसे करने का कोई तरीका है?

उत्तर

0

जब तक आप बैक एंड तक सादे एसक्यूएल पास नहीं करते हैं, तो आपको एक कास्ट का उपयोग करना होगा। (एसक्यूएल कथन INSERT INTO product (name, status) VALUES ('SomeName', 'InStock'); ठीक काम करना चाहिए।)

Tom Lane addressed this issue आपके प्रश्न पूछने के एक सप्ताह बाद pgsql-hackers पर। setString() का तात्पर्य है कि पैरामीटर एक स्ट्रिंग प्रकार का है:

AFAIK यह सिर्फ JDBC के साथ सामान्य रूप से व्यापार है। यह वास्तव में प्रकार आवश्यक है, लेकिन यह एक स्ट्रिंग के अलावा कुछ भी खत्म हो जाएगा। (मैं कोई जावा विशेषज्ञ हूँ, लेकिन मैं याद करने लगते हैं कि बजाय setObject का उपयोग कर मानक समाधान नहीं है।)

Enums यहाँ किसी विशेष कठिनाई पीड़ित नहीं कर रहे हैं, और मैं प्रकार प्रणाली को कमजोर करने देने के लिए के खिलाफ होगी उन्हें एक विशेष पास।

हमारे अपने @ क्रेग्रिंजर participated in that discussion, और अब तक कुछ प्रासंगिक पाया जा सकता है।

+2

मुझे लगता है कि @espeed क्लोजर लाइब्रेरी 'clojure.java.jdbc' के उपयोग के बारे में पूछ रहा है, जावा की जेडीबीसी नहीं। –

1

क्रिस Jurka replied चर्चा माइक Sherrill एक समाधान के साथ ऊपर उद्धृत करने के लिए:

[JDBC कनेक्शन URL में] url पैरामीटर stringtype = अनिर्दिष्ट का उपयोग setString के लिए हमेशा अज्ञात varchar के बजाय, जो करने के लिए बाध्य तो किसी भी कोड परिवर्तन की आवश्यकता नहीं है।

मैंने जावा में यह कोशिश की, और ऐसा लगता है कि यह ठीक काम करता है।

2

मुझे आज stringtype=unspecified हैक वर्कअराउंड का उपयोग करके यह काम मिल गया।

आप इस प्रकार अपने 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! हमेशा की तरह इस्तेमाल करते हैं।

यह समाधान होना अच्छा होगा जो प्रकार की सुरक्षा को कमजोर नहीं करता है।

+0

मैं [इस] (https: //gist.github) पर ठोकर खाई।कॉम/rkneufeld/e5d1acbb007f47655508) एक विकल्प के रूप में। थोड़ा और वर्बोज़ लेकिन शायद देखने लायक हो सकता है। – jsonmurphy