Go से MySQL से जुड़ने का अनुशंसित तरीका क्या है?


163

मैं गो से MySQL डेटाबेस से जुड़ने के लिए एक विश्वसनीय समाधान की तलाश कर रहा हूं। मैंने आसपास कुछ पुस्तकालय देखे हैं, लेकिन पूर्णता और वर्तमान रखरखाव के विभिन्न राज्यों को निर्धारित करना मुश्किल है। मेरे पास जटिल आवश्यकताएं नहीं हैं, लेकिन मैं जानना चाहूंगा कि लोग किस पर भरोसा कर रहे हैं, या MySQL से जुड़ने के लिए सबसे मानक समाधान क्या है।

जवाबों:


263

कुछ ड्राइवर उपलब्ध हैं, लेकिन आपको केवल उन लोगों पर विचार करना चाहिए जो डेटाबेस / sql API को लागू करते हैं

  • यह एक स्वच्छ और कुशल वाक्यविन्यास प्रदान करता है,
  • यह सुनिश्चित करता है कि आप बाद में आयात और कनेक्शन के अलावा अपना कोड बदले बिना ड्राइवर को बदल सकते हैं।

MySQL के लिए दो तेज़ और विश्वसनीय ड्राइवर उपलब्ध हैं:

मैंने उत्पादन में दोनों का उपयोग किया है, लाखों में कनेक्शन नंबर के साथ महीनों तक कार्यक्रम चल रहे हैं बिना किसी विफलता के।

अन्य SQL डेटाबेस ड्रायवर go-wiki पर सूचीबद्ध हैं

MyMySQL का उपयोग करते समय आयात करें:

import (
    "database/sql"
    _ "github.com/ziutek/mymysql/godrv"
)

Go-MySQL- ड्राइवर का उपयोग करते समय आयात करें:

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

MyMySQL का उपयोग करके कनेक्ट करना और बंद करना:

con, err := sql.Open("mymysql", database+"/"+user+"/"+password)
defer con.Close()
// here you can use the connection, it will be closed when function returns

Go-MySQL-Driver का उपयोग करके कनेक्ट करना और बंद करना:

con, err := sql.Open("mysql", store.user+":"+store.password+"@/"+store.database)
defer con.Close()

एक पंक्ति का चयन करें:

row := con.QueryRow("select mdpr, x, y, z from sometable where id=?", id)
cb := new(SomeThing)
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)

कई पंक्तियों का चयन करें और परिणामों के साथ एक सरणी बनाएँ:

rows, err := con.Query("select a, b from item where p1=? and p2=?", p1, p2)
if err != nil { /* error handling */}
items := make([]*SomeStruct, 0, 10)
var ida, idb uint
for rows.Next() {
    err = rows.Scan(&ida, &idb)
    if err != nil { /* error handling */}
    items = append(items, &SomeStruct{ida, idb})
}

सम्मिलित करें:

_, err = con.Exec("insert into tbl (id, mdpr, isok) values (?, ?, 1)", id, mdpr)

आप देखेंगे कि MySQL के साथ Go में काम करना एक आनंदमय अनुभव है: मुझे कभी कोई समस्या नहीं हुई, मेरे सर्वर महीनों तक त्रुटियों या लीक के बिना चलते हैं। तथ्य यह है कि अधिकांश कार्य केवल एक तर्क संख्या को लेते हैं, एक कार्य को हल्का करता है जो कई भाषाओं में कठिन है।

ध्यान दें कि अगर, भविष्य में, आपको एक और MySQL ड्राइवर का उपयोग करने की आवश्यकता है, तो आपको बस एक ही फाइल में दो लाइनें बदलनी होंगी: आयात करने वाली लाइन और कनेक्शन को खोलने वाली लाइन।


2
बहुत बहुत धन्यवाद, मैं इसे एक कोशिश करूँगा। मुझे यह पसंद है कि गो डेटाबेस / sql पैकेज प्रदान करता है जिसे लाइब्रेरी कार्यान्वित कर सकती हैं।
सेर्गी मैंसिला

9
Newbies के लिए उत्कृष्ट प्राइमर। धन्यवाद।
रिक -777

5
परीक्षण किए गए ड्राइवरों की सूची (अन्य DBMS के लिए भी) code.google.com/p/go-wiki/wiki/SQLDrivers पर उपलब्ध है। एक दूसरा लोकप्रिय MySQL-ड्राइवर है: github.com/Go-SQL-Driver/MySQL (मेरे द्वारा लिखा गया)
जूलियन श्मिट

1
@JulienSchmidt मैंने आपके लिंक को संदर्भित करने के लिए अपना उत्तर संपादित किया। यदि आप उन दो ड्राइवरों के बीच तुलना करने के लिए एक लिंक है, यह स्वागत किया जाएगा।
डेनिस सेगुरेट

1
@Zeynel यह सिर्फ एक उदाहरण है ( इस व्यक्तिगत परियोजना से लिया गया )। मैंने इसे प्रतिस्थापित करके संपादित किया SomeThing। उस पंक्ति का बिंदु यह दिखाना है कि मध्यवर्ती चर के बिना आपकी क्वेरी के परिणाम के साथ सीधे एक संरचना कैसे भरें।
डेनिस सेगुरेट

2

चुनिंदा 1 पंक्ति के उदाहरण पर ध्यान देने योग्य कुछ बातें:

row := con.QueryRow("select mdpr, x, y, z from sometable where id=?",id) 
cb := new(SomeThing) 
err := row.Scan(&cb.Mdpr, &cb.X, &cb.Y, &cb.Z)

row.Next()इस उदाहरण में एक कमी है। यह row.Next()पहली पंक्ति को वापस लेने के लिए कॉल करने की आवश्यकता है ।

इसके अलावा पुस्तकालय के लिए कुछ अनम्यता है जो किसी तरह से डेटा न्यूनतावाद को बढ़ावा देने की कोशिश करता है। यदि आप स्तंभों का चयन करने की कोशिश करते हैं जो स्कैन नहीं है तो यह त्रुटियों को फेंक देगा (न केवल चेतावनी)


2
यह सही नहीं है: QueryRow फ़ंक्शन रिटर्न * पंक्ति। यह फ़ंक्शन दावा करता है कि क्वेरी एकल पंक्ति लौटाती है। क्वेरी () रिटर्न (* पंक्तियों, त्रुटि), जिसमें पंक्तियों के लिए कॉल की आवश्यकता होती है। कस्टम ()।
एलन लैमील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.