Qual è il modo consigliato per connettersi a MySQL da Go?


163

Sto cercando una soluzione affidabile per connettermi a un database MySQL da Go. Ho visto alcune biblioteche in giro, ma è difficile determinare i diversi stati di completezza e manutenzione corrente. Non ho esigenze complicate, ma vorrei sapere su cosa si basano le persone o qual è la soluzione più standard per connettersi a MySQL.

Risposte:


263

Sono disponibili alcuni driver, ma è necessario considerare solo quelli che implementano l' API database / sql

  • fornisce una sintassi pulita ed efficiente,
  • ti assicura di poter cambiare il driver in seguito senza cambiare il tuo codice, a parte l'importazione e la connessione.

Sono disponibili due driver veloci e affidabili per MySQL:

Li ho usati entrambi in produzione, i programmi sono in esecuzione da mesi con numeri di connessione in milioni senza errori.

Altri driver di database SQL sono elencati su go-wiki .

Importa quando si utilizza MyMySQL:

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

Importa quando si utilizza Go-MySQL-Driver:

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

Connessione e chiusura tramite 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

Connessione e chiusura tramite Go-MySQL-Driver:

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

Seleziona una riga:

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)

Seleziona più righe e crea un array con risultati:

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

Inserisci:

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

Vedrai che lavorare su Go con MySQL è un'esperienza piacevole: non ho mai avuto problemi, i miei server funzionano per mesi senza errori o perdite. Il fatto che la maggior parte delle funzioni prenda semplicemente un numero variabile di argomenti alleggerisce un compito noioso in molte lingue.

Si noti che se, in futuro, è necessario utilizzare un altro driver MySQL, sarà sufficiente modificare due righe in un unico file: la riga che esegue l'importazione e la riga che apre la connessione.


2
Grazie mille, ci proverò. Adoro che Go fornisca il pacchetto database / sql che le librerie possono implementare.
Sergi Mansilla,

9
Ottimo primer per i neofiti. Grazie.
Rick-777,

5
Un elenco di driver testati (anche per altri DBMS) è disponibile su code.google.com/p/go-wiki/wiki/SQLDrivers Esiste un secondo driver MySQL popolare: github.com/Go-SQL-Driver/MySQL (scritto da me)
Julien Schmidt il

1
@JulienSchmidt Ho modificato la mia risposta per fare riferimento al tuo link. Se ti capita di avere un collegamento a un confronto tra questi due driver, sarebbe il benvenuto.
Denys Séguret,

1
@Zeynel È solo un esempio (tratto da questo progetto personale ). Ho modificato sostituendolo con SomeThing. Il punto di quella linea è mostrare come riempire direttamente una struttura con il risultato della tua query senza variabili intermedie.
Denys Séguret,

2

alcuni aspetti da prendere in considerazione nell'esempio di selezione 1 riga:

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)

manca un row.Next()esempio in questo esempio. deve chiamare il row.Next()per afferrare la prima riga restituita.

inoltre c'è una certa mancanza di flessibilità nella libreria che in qualche modo cerca di promuovere il minimalismo dei dati. se provi a selezionare colonne che non sono Scansione genererà errori (non solo avvisi)


2
Questo non è preciso: la funzione QueryRow restituisce * Row. Questa funzione afferma che la query restituisce una singola riga. Query () restituisce (* Righe, errore), che richiede una chiamata aows.Next ().
Alan LaMielle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.