Quelle est la façon recommandée de se connecter à MySQL à partir de Go?

Je cherche une solution fiable pour me connecter à une firebase database MySQL depuis Go. J’ai vu certaines bibliothèques autour 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 comptent, ou quelle est la solution la plus standard pour se connecter à MySQL.

Quelques pilotes sont disponibles mais vous ne devriez considérer que ceux qui implémentent l’API database / sql

  • il fournit une syntaxe propre et efficace,
  • Cela vous permet de changer ultérieurement le pilote sans modifier votre code, à l’exception de l’importation et de la connexion.

Deux pilotes rapides et fiables sont disponibles pour MySQL:

  • MyMySQL
  • Go-MySQL-Driver

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

Les autres pilotes de firebase database SQL sont listés sur go-wiki .

Importer en utilisant MyMySQL:

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

Importer en utilisant Go-MySQL-Driver:

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

Connexion et fermeture via 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 via Go-MySQL-Driver:

 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 des 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 avec Go avec MySQL est une expérience délicieuse: 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 changer deux lignes dans un seul fichier: la ligne effectuant l’importation et la ligne ouvrant la connexion.

peu de choses à prendre en compte l’exemple de sélection 1 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 y a une ligne manquante. row.Next() dans cet exemple. il faut appeler row.Next() pour saisir la première ligne renvoyée.

Il y a aussi une certaine rigidité à la bibliothèque qui tente en quelque sorte de promouvoir le minimalisme des données. Si vous essayez de sélectionner des colonnes qui ne sont pas Scan, elles afficheront des erreurs (pas seulement des avertissements)