Apa cara yang disarankan untuk terhubung ke MySQL dari Go?

163

Saya mencari solusi yang dapat diandalkan untuk terhubung ke database MySQL dari Go. Saya telah melihat beberapa perpustakaan di sekitar tetapi sulit untuk menentukan berbagai status kelengkapan dan pemeliharaan saat ini. Saya tidak memiliki kebutuhan yang rumit, tetapi saya ingin tahu apa yang diandalkan orang, atau solusi apa yang paling standar untuk terhubung ke MySQL.

Sergi Mansilla
sumber

Jawaban:

263

Beberapa driver tersedia tetapi Anda hanya harus mempertimbangkan mereka yang mengimplementasikan database / sql API

  • ini menyediakan sintaksis yang bersih dan efisien,
  • itu memastikan Anda nantinya dapat mengubah driver tanpa mengubah kode Anda, selain impor dan koneksi.

Dua driver cepat dan andal tersedia untuk MySQL:

Saya telah menggunakan keduanya dalam produksi, program berjalan selama berbulan-bulan dengan nomor koneksi dalam jutaan tanpa kegagalan.

Pengandar basis data SQL lainnya terdaftar di go-wiki .

Impor saat menggunakan MyMySQL:

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

Impor saat menggunakan Go-MySQL-Driver:

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

Menghubungkan dan menutup menggunakan 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

Menghubungkan dan menutup menggunakan Go-MySQL-Driver:

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

Pilih satu baris:

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)

Pilih beberapa baris dan bangun array dengan hasil:

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

Memasukkan :

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

Anda akan melihat bahwa bekerja di Go with MySQL adalah pengalaman yang menyenangkan: Saya tidak pernah punya masalah, server saya berjalan selama berbulan-bulan tanpa kesalahan atau kebocoran. Fakta bahwa sebagian besar fungsi hanya mengambil sejumlah variabel argumen meringankan tugas yang membosankan dalam banyak bahasa.

Perhatikan bahwa jika, di masa depan, Anda perlu menggunakan driver MySQL lain, Anda hanya perlu mengubah dua baris dalam satu file go: baris yang melakukan impor dan jalur yang membuka koneksi.

Denys Séguret
sumber
2
Terima kasih banyak, saya akan mencobanya. Saya suka Go menyediakan paket database / sql yang dapat diimplementasikan oleh perpustakaan.
Sergi Mansilla
9
Primer yang sangat baik untuk pemula. Terima kasih.
Rick-777
5
Daftar driver yang teruji (untuk DBMS lainnya juga) tersedia di code.google.com/p/go-wiki/wiki/SQLDrivers Ada driver-MySQL populer kedua: github.com/Go-SQL-Driver/MySQL (ditulis oleh saya)
Julien Schmidt
1
@JulienSchmidt Saya mengedit jawaban saya untuk referensi tautan Anda. Jika Anda memiliki tautan ke perbandingan antara kedua driver, itu akan diterima.
Denys Séguret
1
@ Zeynel Ini hanya sebuah contoh (diambil dari proyek pribadi ini ). Saya mengedit untuk menggantikannya SomeThing. Maksud dari baris itu adalah untuk menunjukkan bagaimana cara mengisi secara langsung struct dengan hasil dari query Anda tanpa variabel perantara.
Denys Séguret
2

beberapa hal yang perlu diperhatikan contoh pilih 1 baris:

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)

ada yang hilang row.Next()dalam contoh ini. perlu memanggil row.Next()untuk mengambil baris pertama yang dikembalikan.

juga ada beberapa ketidakfleksibelan ke perpustakaan yang dalam beberapa cara mencoba untuk mempromosikan minimalisme data. jika Anda mencoba untuk memilih kolom yang bukan Pindai itu akan menimbulkan kesalahan (bukan hanya peringatan)

Badoet
sumber
2
Ini tidak akurat: fungsi QueryRow mengembalikan * Row. Fungsi ini menegaskan bahwa kueri mengembalikan satu baris. Kueri () mengembalikan (* Baris, kesalahan), yang memang membutuhkan panggilan ke baris. Berikutnya ().
Alan LaMielle