web-dev-qa-db-fra.com

Quelle est la méthode recommandée pour vous connecter à MySQL à partir de Go?

Je recherche une solution fiable pour me connecter à une base de données MySQL de Go. J'ai vu des bibliothèques dans le coin mais il est difficile de déterminer les différents états de complétude et de maintenance actuelle. Je n'ai pas de besoins compliqués, mais j'aimerais savoir sur quoi les gens se fient ou quelle est la solution la plus standard pour se connecter à MySQL.

157
Sergi Mansilla

Quelques pilotes sont disponibles, mais vous ne devez considérer que ceux qui implémentent l'API database/sql comme

  • il fournit une syntaxe propre et efficace,
  • cela garantit que vous pouvez changer le pilote ultérieurement sans changer votre code, à l'exception de l'importation et de la connexion.

Deux pilotes rapides et fiables sont disponibles pour MySQL:

Je les utilise tous les deux en production, les programmes fonctionnent depuis des mois avec des numéros de connexion de plusieurs millions sans échec.

Autres pilotes de base de données SQL sont listés sur go-wiki .

Importer avec MyMySQL:

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

Importer avec Go-MySQL-Driver:

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

Connexion et fermeture à l'aide de 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

Connexion et fermeture à l'aide du pilote Go-MySQL:

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

Sélectionnez une ligne:

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)

Sélectionnez plusieurs lignes et créez un tableau avec les résultats suivants:

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

Insérer:

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

Vous verrez que travailler avec Go avec MySQL est une expérience agréable: moi jamais je n’avais un problème, mes serveurs fonctionnent pendant des mois sans erreurs ni fuites. Le fait que la plupart des fonctions prennent simplement un nombre variable d'arguments allège une tâche fastidieuse dans de nombreuses langues.

Notez que si, par la suite, vous devez utiliser un autre pilote MySQL, il vous suffira de modifier deux lignes en un fichier: la ligne qui effectue l'importation et la ligne qui ouvre la connexion.

257
Denys Séguret

quelques éléments à prendre en compte, par exemple, l'option select 1 row:

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)

il manque un row.Next() dans cet exemple. il faut appeler la row.Next() pour récupérer la première ligne retournée.

il y a aussi une certaine rigidité pour la bibliothèque qui essaie en quelque sorte de promouvoir le minimalisme des données. si vous essayez de sélectionner des colonnes qui ne sont pas Scan, cela générera des erreurs (pas seulement des avertissements)

2
Badoet