¿Cuál es la forma recomendada de conectarse a MySQL desde Go?

Estoy buscando una solución confiable para conectarme a una base de datos MySQL desde Go. He visto algunas bibliotecas pero es difícil determinar los diferentes estados de compleción y mantenimiento actual. No tengo necesidades complicadas, pero me gustaría saber en qué se basan las personas o cuál es la solución más estándar para conectarse a MySQL.

Algunos controladores están disponibles, pero solo debe considerar aquellos que implementan la API de base de datos / SQL como

  • proporciona una syntax limpia y eficiente,
  • asegura que más tarde puede cambiar el controlador sin cambiar su código, aparte de la importación y la conexión.

Dos controladores rápidos y confiables están disponibles para MySQL:

  • MyMySQL
  • Go-MySQL-Driver

Los he usado a ambos en producción, los progtwigs se ejecutan durante meses con números de conexión de millones sin fallas.

Otros controladores de bases de datos SQL se enumeran en go-wiki .

Importar al usar MyMySQL:

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

Importar cuando se usa Go-MySQL-Driver:

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

Conectando y cerrando usando 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 

Conectando y cerrando usando Go-MySQL-Driver:

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

Seleccione una fila:

 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) 

Seleccione varias filas y construya una matriz con resultados:

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

Insertar:

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

Verás que trabajar en Go with MySQL es una experiencia deliciosa: nunca tuve un problema, mis servidores se ejecutan durante meses sin errores o pérdidas. El hecho de que la mayoría de las funciones simplemente toman una cantidad variable de argumentos aligera una tarea que es tediosa en muchos idiomas.

Tenga en cuenta que si, en el futuro, necesita usar otro controlador MySQL, solo tendrá que cambiar dos líneas en un archivo go: la línea que realiza la importación y la línea que abre la conexión.

Algunas cosas para tomar en cuenta el ejemplo de seleccionar 1 fila:

 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) 

hay una row.Next() faltante. row.Next() en este ejemplo. necesita llamar a la fila. row.Next() para tomar la primera fila devuelta.

también hay cierta inflexibilidad a la biblioteca que de alguna manera intenta promover el minimalismo de datos. si intenta seleccionar columnas que no son Scan, arrojará errores (no solo advertencias)