Go'dan MySQL'e bağlanmanın önerilen yolu nedir?


163

Go'dan bir MySQL veritabanına bağlanmak için güvenilir bir çözüm arıyorum. Çevresinde bazı kütüphaneler gördüm ama farklı bütünlük durumlarını ve mevcut bakımı belirlemek zor. Karmaşık ihtiyaçlarım yok, ama insanların neye güvendiğini veya MySQL'e bağlanmak için en standart çözümün ne olduğunu bilmek istiyorum.

Yanıtlar:


263

Birkaç sürücü mevcuttur, ancak yalnızca veritabanı / sql API'sini uygulayanları

  • temiz ve verimli bir sözdizimi sağlar,
  • daha sonra içe aktarma ve bağlantı dışında kodunuzu değiştirmeden sürücüyü değiştirmenizi sağlar.

MySQL için iki hızlı ve güvenilir sürücü mevcuttur:

Her ikisini de üretimde kullandım, programlar milyonlarca bağlantı numarasıyla aylarca sorunsuz çalışıyor.

Diğer SQL veritabanı sürücüleri go-wiki'de listelenir .

MyMySQL kullanırken içe aktar:

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

Go-MySQL-Driver kullanırken içe aktarın:

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

MyMySQL kullanarak bağlanma ve kapatma:

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 kullanarak bağlanma ve kapatma:

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

Bir satır seçin:

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)

Birden çok satır seçin ve sonuçları içeren bir dizi oluşturun:

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

Ekle:

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

Go with MySQL ile çalışmanın keyifli bir deneyim olduğunu göreceksiniz: Hiç sorun yaşamadım, sunucularım aylarca hatasız veya sızıntısız çalışıyor. Çoğu fonksiyonun değişken sayıda argüman alması birçok dilde sıkıcı bir görevi hafifletir.

Gelecekte başka bir MySQL sürücüsü kullanmanız gerekiyorsa, tek bir dosyada iki satırı değiştirmeniz gerekecektir: içe aktarmayı yapan satır ve bağlantıyı açan satır.


2
Çok teşekkür ederim, deneyeceğim. Go, kütüphanelerin uygulayabileceği veritabanı / sql paketini sağlıyor.
Sergi Mansilla

9
Yeni başlayanlar için mükemmel astar. Teşekkürler.
Rick-777

5
Test edilmiş sürücülerin bir listesi (diğer DBMS'ler için de) code.google.com/p/go-wiki/wiki/SQLDrivers adresinde bulunabilir İkinci bir popüler MySQL sürücüsü var: github.com/Go-SQL-Driver/MySQL (Benim tarafımdan yazılmış)
Julien Schmidt

1
@JulienSchmidt Cevabınızı referans göstermek için cevabımı düzenledim. Bu iki sürücü arasında bir karşılaştırma bağlantısı varsa, memnuniyetle karşılanacaktır.
Denys Séguret

1
@Zeynel Bu sadece bir örnek ( bu kişisel projeden alınmıştır ). Onunla değiştirdim SomeThing. Bu satırın amacı, ara değişkenler olmadan sorgunun sonucuyla doğrudan bir yapının nasıl doldurulacağını göstermektir.
Denys Séguret

2

1 satır örneği seçilmesi gereken birkaç şey:

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()bu örnekte bir eksik var . row.Next()döndürülen ilk satırı kapmak için çağırmanız gerekir .

ayrıca kütüphanede bir şekilde veri minimalizmini teşvik etmeye çalışan bir esneklik yoktur. Tara olmayan sütunları seçmeye çalışırsanız hata verir (yalnızca uyarılar değil)


2
Bu doğru değil: QueryRow işlevi * Satır döndürür. Bu işlev, sorgunun tek bir satır döndürdüğünü iddia eder. Query (), rows.Next () öğesini çağırmayı gerektiren (* Satırlar, hata) döndürür.
Alan LaMielle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.