2012-07-05 14 views
140

Szukam niezawodne rozwiązanie do łączenia się z bazą danych MySQL z Go. Widziałem już kilka bibliotek, ale trudno jest określić różne stany kompletności i bieżące utrzymanie. Nie mam skomplikowanych potrzeb, ale chciałbym wiedzieć, na czym polegają ludzie, lub jakie jest najbardziej standardowe rozwiązanie do łączenia się z MySQL.Jaki jest zalecany sposób łączenia się z MySQL z Go?

Odpowiedz

245

Kilka sterowników są dostępne, ale należy brać pod uwagę tylko te, które realizować database/sql API jako

  • zapewnia czyste i sprawne składni,
  • zapewnia można później zmienić kierowcę bez zmiany kodu oprócz importu i połączenia.

Dwie szybkie i niezawodne sterowniki są dostępne dla MySQL:

Używałem obu z nich w produkcji, programy są uruchomione przez wiele miesięcy z podłączeniem liczby w milionach bez awarii.

Inne sterowniki bazy danych SQL are listed on go-wiki.

importu przy użyciu MyMySQL:

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

importu przy użyciu Go-mysql-driver:

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

Podłączanie i zamykanie za pomocą 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 

Podłączanie i zamykanie za pomocą Go-mysql-driver:

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

Wybierz jeden wiersz:

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) 

wybrać wiele wierszy i zbudować tablicę wyników:

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

Wkładka:

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

Zobaczysz, że praca w Go z MySQL to wspaniałe doświadczenie: Nigdymiał problem, moje serwery prowadzony przez wiele miesięcy bez błędów lub przecieków. Fakt, że większość funkcji przyjmuje po prostu zmienną liczbę argumentów, rozjaśnia zadanie, które jest żmudne w wielu językach.

Pamiętaj, że jeśli w przyszłości będziesz musiał użyć innego sterownika MySQL, musisz po prostu zmienić dwa wiersze w jednym pliku: linii, która importuje i linii otwierającej połączenie.

+2

Dziękuję bardzo, spróbuję. Uwielbiam to, że Go dostarcza pakiet database/sql, który biblioteki mogą zaimplementować. – GiantSquid

+0

Jest podobny do tego, co istnieje w innych językach (na przykład JDBC), ale z czystszą i lżejszą składnią. –

+8

Doskonały podkład dla początkujących. Dzięki. –

0

kilka rzeczy, aby wziąć pod uwagę, select przykład 1 rząd:

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) 

jest tam brakuje row.Next() w tym przykładzie. musi zadzwonić pod numer row.Next(), aby pobrać pierwszy zwracany wiersz.

również istnieje pewna nietrwałość biblioteki, która w jakiś sposób stara się promować minimalizm danych. jeśli spróbujesz wybrać kolumny, które nie są Skanowane, będą wyświetlać błędy (nie tylko ostrzeżenia).

+2

To nie jest dokładne: funkcja QueryRow zwraca * Wiersz. Ta funkcja zapewnia, że ​​zapytanie zwróci pojedynczy wiersz. Query() zwraca (* wiersze, błąd), które wymagają wywołania do rows.Next(). –

Powiązane problemy