Quelle est la méthode recommandée pour se connecter à MySQL depuis Go?

163

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

Sergi Mansilla
la source

Réponses:

263

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 pourrez plus tard changer le pilote sans changer votre code, à part l'importation et la connexion.

Deux pilotes rapides et fiables sont disponibles pour MySQL:

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

D'autres pilotes de base de données SQL sont répertoriés sur go-wiki .

Importer lors de l'utilisation de MyMySQL:

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

Importer lors de l'utilisation de Go-MySQL-Driver:

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

Connexion et fermeture avec 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:

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 en Go avec MySQL est une expérience agréable: je n'ai jamais eu de 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, à l'avenir, vous devez utiliser un autre pilote MySQL, il vous suffira de modifier deux lignes dans un fichier aller: la ligne effectuant l'importation et la ligne ouvrant la connexion.

Denys Séguret
la source
2
Merci beaucoup, je vais essayer. J'adore le fait que Go fournisse le package database / sql que les bibliothèques peuvent implémenter.
Sergi Mansilla
9
Excellent apprêt pour les débutants. Merci.
Rick-777
5
Une liste des pilotes testés (pour d'autres SGBD également) est disponible sur code.google.com/p/go-wiki/wiki/SQLDrivers Il existe un deuxième pilote MySQL populaire: github.com/Go-SQL-Driver/MySQL (écrit par moi)
Julien Schmidt
1
@JulienSchmidt J'ai édité ma réponse pour référencer votre lien. Si vous avez un lien vers une comparaison entre ces deux facteurs, ce serait le bienvenu.
Denys Séguret
1
@Zeynel C'est juste un exemple (tiré de ce projet personnel ). Je l'ai modifié en le remplaçant par SomeThing. Le but de cette ligne est de montrer comment remplir directement une structure avec le résultat de votre requête sans variables intermédiaires.
Denys Séguret
2

quelques choses à prendre en compte dans l'exemple de sélection d'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)

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

il y a aussi une certaine rigidité dans la bibliothèque qui, d'une certaine manière, essaie 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)

Badoet
la source
2
Ce n'est pas exact: la fonction QueryRow renvoie * Row. Cette fonction affirme que la requête renvoie une seule ligne. Query () renvoie (* Rows, error), ce qui nécessite un appel à rows.Next ().
Alan LaMielle