Cách kết nối với MySQL từ Go là gì?


163

Tôi đang tìm kiếm một giải pháp đáng tin cậy để kết nối với cơ sở dữ liệu MySQL từ Go. Tôi đã thấy một số thư viện xung quanh nhưng rất khó để xác định các trạng thái khác nhau của tính đầy đủ và bảo trì hiện tại. Tôi không có nhu cầu phức tạp, nhưng tôi muốn biết mọi người đang dựa vào điều gì, hoặc giải pháp chuẩn nhất để kết nối với MySQL là gì.

Câu trả lời:


262

Một vài trình điều khiển có sẵn nhưng bạn chỉ nên xem xét những trình điều khiển triển khai API cơ sở dữ liệu / sql như

  • nó cung cấp một cú pháp sạch và hiệu quả,
  • nó đảm bảo sau này bạn có thể thay đổi trình điều khiển mà không cần thay đổi mã, ngoài việc nhập và kết nối.

Hai trình điều khiển nhanh và đáng tin cậy có sẵn cho MySQL:

Tôi đã sử dụng cả hai sản phẩm này, các chương trình đang chạy trong nhiều tháng với số lượng kết nối trong hàng triệu mà không gặp sự cố.

Các trình điều khiển cơ sở dữ liệu SQL khác được liệt kê trên go-wiki .

Nhập khi sử dụng MyMySQL:

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

Nhập khi sử dụng Go-MySQL-Driver:

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

Kết nối và đóng bằng 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

Kết nối và đóng bằng Go-MySQL-Driver:

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

Chọn một hàng:

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)

Chọn nhiều hàng và xây dựng một mảng với kết quả:

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})
}

Chèn :

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

Bạn sẽ thấy rằng làm việc trong Go with MySQL là một trải nghiệm thú vị: Tôi chưa bao giờ gặp sự cố, máy chủ của tôi chạy trong nhiều tháng mà không có lỗi hoặc rò rỉ. Thực tế là hầu hết các hàm chỉ đơn giản là lấy một số lượng đối số khác nhau làm sáng tỏ một nhiệm vụ tẻ nhạt trong nhiều ngôn ngữ.

Lưu ý rằng, trong tương lai, bạn cần sử dụng trình điều khiển MySQL khác, bạn sẽ chỉ phải thay đổi hai dòng trong một tệp: dòng thực hiện nhập và dòng mở kết nối.


2
Cảm ơn bạn rất nhiều, tôi sẽ thử. Tôi thích rằng Go cung cấp gói cơ sở dữ liệu / sql mà các thư viện có thể thực hiện.
Sergi Mansilla

9
Primer tuyệt vời cho người mới. Cảm ơn.
Rick-777

5
Danh sách các trình điều khiển được thử nghiệm (đối với các DBMS khác cũng có sẵn tại code.google.com/p/go-wiki/wiki/QueryDrivers Có trình điều khiển MySQL phổ biến thứ hai: github.com/Go-Query-Driver/MyQuery (được viết bởi tôi)
Julien Schmidt

1
@JulienSchmidt Tôi đã chỉnh sửa câu trả lời của mình để tham khảo liên kết của bạn. Nếu bạn tình cờ có một liên kết để so sánh giữa hai trình điều khiển đó, nó sẽ được hoan nghênh.
Denys Séguret

1
@Zeynel Đó chỉ là một ví dụ (lấy từ dự án cá nhân này ). Tôi chỉnh sửa thay thế nó bằng SomeThing. Điểm của dòng đó là chỉ ra cách điền trực tiếp vào một cấu trúc với kết quả truy vấn của bạn mà không có các biến trung gian.
Denys Séguret

2

Một số điều cần lưu ý ví dụ chọn 1 hàng:

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)

có một thiếu row.Next()trong ví dụ này. nó cần gọi row.Next()để lấy hàng đầu tiên trả về.

cũng có một số tính không linh hoạt đối với thư viện mà theo một cách nào đó cố gắng thúc đẩy sự tối giản dữ liệu. nếu bạn cố gắng chọn các cột không quét, nó sẽ xuất hiện lỗi (không chỉ cảnh báo)


2
Điều này không chính xác: hàm QueryRow trả về * Hàng. Hàm này xác nhận rằng truy vấn trả về một hàng đơn. Truy vấn () trả về (* Hàng, lỗi), yêu cầu gọi đến hàng.Next ().
Alan LaMielle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.