วิธีที่แนะนำในการเชื่อมต่อกับ MySQL จาก Go คืออะไร?


163

ฉันกำลังมองหาโซลูชันที่เชื่อถือได้เพื่อเชื่อมต่อกับฐานข้อมูล MySQL จาก Go ฉันเคยเห็นห้องสมุดรอบ ๆ แล้ว แต่ก็ยากที่จะกำหนดสถานะที่แตกต่างของความสมบูรณ์และการบำรุงรักษาในปัจจุบัน ฉันไม่มีความต้องการที่ซับซ้อน แต่ฉันต้องการที่จะรู้ว่าสิ่งที่ผู้คนพึ่งพาหรืออะไรคือโซลูชั่นมาตรฐานที่สุดในการเชื่อมต่อกับ MySQL

คำตอบ:


263

มีไดร์เวอร์บางตัวให้ใช้ แต่คุณควรพิจารณาเฉพาะไดรเวอร์ที่ใช้ฐานข้อมูล / sql API เป็น

  • มันมีไวยากรณ์ที่สะอาดและมีประสิทธิภาพ
  • มันช่วยให้คุณสามารถเปลี่ยนไดรเวอร์ได้ในภายหลังโดยไม่ต้องเปลี่ยนรหัสนอกเหนือจากการนำเข้าและการเชื่อมต่อ

MySQL มีสองไดรเวอร์ที่รวดเร็วและเชื่อถือได้:

ฉันใช้ทั้งสองอย่างในการผลิตโปรแกรมกำลังทำงานเป็นเวลาหลายเดือนโดยมีหมายเลขการเชื่อมต่อเป็นล้าน ๆ โดยไม่ล้มเหลว

ไดรเวอร์ฐานข้อมูล SQL อื่น ๆมีการระบุไว้ในระหว่างการเดินทาง-วิกิพีเดีย

นำเข้าเมื่อใช้ MyMySQL:

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

นำเข้าเมื่อใช้ Go-MySQL-Driver:

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:

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)

คุณจะเห็นว่าการทำงานกับ Go with MySQL เป็นประสบการณ์ที่น่ายินดี: ฉันไม่เคยมีปัญหาเซิร์ฟเวอร์ของฉันทำงานมาหลายเดือนโดยไม่มีข้อผิดพลาดหรือรั่วไหล ความจริงที่ว่าฟังก์ชั่นส่วนใหญ่นั้นใช้จำนวนอาร์กิวเมนต์ที่หลากหลายทำให้งานที่น่าเบื่อในหลายภาษานั้นเบาลง

โปรดทราบว่าหากในอนาคตคุณต้องใช้ไดรเวอร์ MySQL ตัวอื่นคุณจะต้องเปลี่ยนสองบรรทัดในไฟล์ go เดียว: บรรทัดที่ทำการอิมพอร์ตและบรรทัดที่เปิดการเชื่อมต่อ


2
ขอบคุณมากฉันจะลองดู ฉันชอบที่ Go ให้แพคเกจฐานข้อมูล / sql ที่ห้องสมุดสามารถนำไปใช้ได้
Sergi Mansilla

9
ไพรเมอร์ที่ยอดเยี่ยมสำหรับมือใหม่ ขอบคุณ
Rick-777

5
รายการไดรเวอร์ที่ทดสอบแล้ว (สำหรับ DBMS อื่น ๆ ด้วย) มีอยู่ที่code.google.com/p/go-wiki/wiki/SQLDrivers มีโปรแกรมควบคุม MySQL ที่ได้รับความนิยมเป็นอันดับสอง: github.com/Go-SQL-Driver/MySQL (เขียนโดยฉัน)
Julien Schmidt

1
@JulienSchmidt ฉันแก้ไขคำตอบของฉันเพื่ออ้างอิงลิงค์ของคุณ หากคุณมีลิงค์เชื่อมโยงไปยังการเปรียบเทียบระหว่างไดรเวอร์ทั้งสองก็ยินดีต้อนรับ
Denys Sguret

1
@ Zeynel มันเป็นเพียงตัวอย่าง (นำมาจากโครงการส่วนตัวนี้ ) SomeThingฉันแก้ไขแทนที่มันด้วย จุดของบรรทัดนั้นคือการแสดงวิธีเติมโครงสร้างโดยตรงกับผลลัพธ์ของแบบสอบถามโดยไม่มีตัวแปรกลาง
Denys Séguret

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 ส่งคืน * Row ฟังก์ชันนี้ยืนยันว่าแบบสอบถามส่งคืนแถวเดียว Query () ส่งคืน (* แถวข้อผิดพลาด) ซึ่งไม่ต้องการการเรียกไปยัง rows.Next ()
Alan LaMielle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.