आप पहचानकर्ताओं (जैसे तालिका और स्तंभ नाम) के लिए प्लेसहोल्डर का उपयोग नहीं कर सकते हैं, प्लेसहोल्डर मानों के लिए हैं . आप पहचानकर्ताओं के बारे में सोच सकते हैं कि वे गो में चर या फ़ंक्शन नामों के समान हैं, इसलिए पहचानकर्ताओं के लिए प्लेसहोल्डर का उपयोग करने में सक्षम होना eval
होने के समान होगा जैसा कि विभिन्न स्क्रिप्टिंग भाषाओं में होता है।
यह आपको fmt.Sprintf
. का उपयोग करने के लिए कम कर देता है और जब आप रनटाइम तक पहचानकर्ताओं को नहीं जानते हैं तो SQL बनाने के लिए समान स्ट्रिंग ऑपरेशन:
col := "firstName"
sql := fmt.Sprintf("select %s from persons", col)
लेकिन यह आपको SQL इंजेक्शन के लिए खोलता है और समस्याओं को उद्धृत करता है ताकि आप किसी प्रकार की श्वेतसूची चाहते हैं:
quotedColumns := map[string]string{
"firstName": "`firstName`",
"lastName": "`lastName`",
...
}
quoted, ok := quotedColumns[columnName]
if !ok {
// Do something with the error here and run away...
}
sql := fmt.Sprintf("select %s from persons", quoted)
ध्यान दें कि मैंने मानचित्र के मानों में MySQL बैकटिक उद्धरण शामिल किया है। किसी पहचानकर्ता को उद्धृत/भागने के लिए मानक इंटरफ़ेस में कुछ भी नहीं है, इसलिए आपको इसे स्वयं करना होगा। यदि आप पहले से ही श्वेतसूची का नक्शा हाथ से लिख रहे हैं तो आप उद्धरण को हाथ से भी शामिल कर सकते हैं; अन्यथा आप एक जोड़े (उम्मीद) सरल स्ट्रिंग संचालन को उद्धृत करने और करने पर MySQL दस्तावेज़ पढ़कर पहचानकर्ताओं के लिए अपना स्वयं का उद्धरण फ़ंक्शन लिख सकते हैं।