2013-12-08 7 views
5

में पैरामीटर नामित पैरामीटर मैं यह पता लगाने की कोशिश कर रहा हूं कि गो के अंतर्निहित डेटाबेस/एसक्यूएल पैकेज में नामित पैरामीटर का उपयोग करने के लिए पैटर्न क्या है। मैंने ऑरैकल ड्राइवर को देखा, लेकिन यह सी पुस्तकालय के लिए सिर्फ एक रैपर की तरह लगता है। क्या लोगों ने इसे एक सुंदर तरीके से हल किया है? अब तक मैंने यूनिट परीक्षणों में पैरामीटर के रूप में {0}, {1} डालकर समस्या के आसपास काम किया है, लेकिन यह सुनिश्चित करना अच्छा होगा कि उन्हें सामान्य रूप से map[string]interface{} या कुछ के रूप में उपयोग करने में सक्षम होना अच्छा लगेगा। क्या किसी के पास कोई विचार या कार्यान्वयन है जो मूर्खतापूर्ण प्रतीत होता है?डेटाबेस/एसक्यूएल और डेटाबेस/एसक्यूएल/ड्राइवर

db := testConn() 
stmt, err := db.Prepare("return {0} as int1, {1} as int2") 
if err != nil { 
    t.Fatal(err) 
} 
rows, err := stmt.Query(123, 456) 
if err != nil { 
    t.Fatal(err) 
} 
rows.Next() 

var test int 
var test2 int 
err = rows.Scan(&test, &test2) 
if err != nil { 
    t.Fatal(err) 
} 
if test != 123 { 
    t.Fatal("test != 123;", test) 
} 
if test2 != 456 { 
    t.Fatal("test2 != 456;", test2) 
} 

और क्या मैं Query में कर रहा हूँ है:

func (stmt *cypherStmt) Query(args []driver.Value) (driver.Rows, error) { 
    cyphReq := cypherRequest{ 
     Query: stmt.query, 
    } 
    if len(args) > 0 { 
     cyphReq.Params = make(map[string]interface{}) 
    } 
    for idx, e := range args { 
     cyphReq.Params[strconv.Itoa(idx)] = e 
    } 
... 
+0

मौजूदा उत्तर मानते हैं कि आप एक ग्राहक लिख रहे हैं, लेकिन ऐसा लगता है कि आप एक ड्राइवर लिख रहे हैं। क्या वह सही है? – andybalholm

+0

हाँ: https://github.com/wfreeman/cq –

+0

डेटाबेस/एसक्यूएल पैकेज स्थिति पैरामीटर के आसपास बनाया गया है, नामित पैरामीटर नहीं। तो नामित पैरामीटर का उपयोग करने के लिए कोई कामकाज लगभग परिभाषा के अनुसार unidiomatic होगा। – andybalholm

उत्तर

1

यह एक map[string]interface{} प्रकार है कि driver.Valuer{} लागू करता है एक []byte के रूप में यह क्रमानुसार करने को बनाने के लिए संभव होगा और: मैं व्यक्तिगत रूप से gorp जो आप structs या नक्शे के सवालों के लिए बाध्य करने की अनुमति देता का उपयोग फिर इसे ड्राइवर में वापस परिवर्तित करें।

लेकिन यह अक्षम और unidiomatic होगा। चूंकि आपका चालक तब भी गैर-मानक तरीके से उपयोग किया जाएगा, इसलिए शायद डेटाबेस/एसक्यूएल के बारे में भूलना और पूरी तरह से कस्टम इंटरफेस के साथ एक पैकेज लिखना बेहतर होगा।

8

मैं डेटाबेस/एसक्यूएल के शीर्ष पर आवरण का उपयोग कर रहा sqlx बुलाया

संदर्भ के लिए, एक परीक्षण है https://github.com/jmoiron/sqlx आप यहां देख सकते हैं कि उसने यह कैसे किया।

कैसे एक टपल में चयन करने के लिए कैसे एक टपल

dude := Person{ 
    FirstName:"Jason", 
    LastName:"Moiron", 
    Email:"[email protected]" 
} 
_, err = db.NamedExec(`INSERT INTO person (first_name,last_name,email) VALUES (:first,:last,:email)`, dude) 
+0

मेरा प्रश्न एक तरह का रिवर्स है - मानचित्र के रूप में पैरामीटर कैसे डालें। –

+0

मैंने एक प्रश्न को संपादित किया है जिसमें एक ट्यूपल – Goranek

+0

कूल डालने के तरीके के विवरण के साथ एक प्रश्न संपादित किया गया है - मैं अभी भी किसी के लिए देशी डेटाबेस/एसक्यूएल पैकेज के साथ एक रास्ता दिखाने की उम्मीद कर रहा हूं। –

4

जहाँ तक मुझे पता है, कोई ड्राइवर देशी रूप में नामित किया मापदंडों के लिए प्रदान करता है सम्मिलित करने के लिए पर

type Person struct { 
    FirstName string `db:"first_name"` 
    LastName string `db:"last_name"` 
    Email  string 
} 
jason = Person{} 
err = db.Get(&jason, "SELECT * FROM person WHERE first_name=$1", "Jason") 
fmt.Printf("%#v\n", jason) 
// Person{FirstName:"Jason", LastName:"Moiron", Email:"[email protected]"} 

उदाहरण पर उदाहरण।

_, err = dbm.Select(&users, 
    "select * from PersistentUser where mykey = :Key", 
    map[string]interface{}{ 
     "Key": 43, 
    } 
) 

या

_, err = dbm.Select(&users, 
    "select * from PersistentUser where mykey = :Key", 
    User{Key: 43}, 
) 
+0

उल्लेख करने के लिए धन्यवाद - यह बहुत चिकना है। मैं देशी डेटाबेस/एसक्यूएल पैकेज के साथ एक रास्ता की उम्मीद कर रहा हूँ। –

+3

आप इसे देशी डेटाबेस/एसक्यूएल के साथ नहीं कर सकते हैं – Goranek

संबंधित मुद्दे