Una de las preguntas más frecuentes que recibo sobre el desarrollo web en Go es cómo conectarse a una base de datos SQL. Afortunadamente, Go tiene un fantástico paquete de SQL en la biblioteca estándar que nos permite utilizar una gran cantidad de controladores para diferentes bases de datos SQL.
En este ejemplo vamos a conectarnos a una base de datos SQLite, pero la sintaxis (salvo alguna pequeña semántica SQL) es la misma para una base de datos MySQL o PostgreSQL.
package main
import (
"database/sql"
"fmt"
"log"
"net/http"
_ "github.com/mattn/go-sqlite3"
)
func main() {
bd := NuevaBD()
log.Println("Escucha en: 8080")
http.ListenAndServe(":8080", MuestraLibros(bd))
}
func MuestraLibros(bd *sql.DB) http.Handler {
return http.HandlerFunc(func (rw http.ResponseWriter, r *http.Request) {
var título, autor string
err: = bd.QueryRow("select title, author from libros").Scan(&título, &autor)
if err != nil {
panic(err)
}
fmt.Fprintf(rw, "El primer libro es '%s' de '%s'", título, autor)
})
}
func NuevaBD() *sql.DB {
bd, err := sql.Open("sqlite3", "ejemplo.sqlite")
if err != nil {
panic(err)
}
_, err = bd.Exec("create table if not exists books(titulo text, autor text)" )
if err != nil {
panic(err)
}
return bd
}
Query
en nuestro ejemplo sql.DB
para
extraer una colección de filas y asignarlos a estructuras.github.com/jmoiron/sqlx
y observa las mejoras realizadas
sobre el paquete database/sql
existente en la biblioteca estándar.