Construyendo aplicaciones Web con Go

Bases de datos

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
}

Ejercicios

  1. Haz uso de la función Query en nuestro ejemplo sql.DB para extraer una colección de filas y asignarlos a estructuras.
  2. Añade la capacidad de insertar nuevos registros en la base de datos mediante el uso de un formulario HTML.
  3. Busca en github.com/jmoiron/sqlx y observa las mejoras realizadas sobre el paquete database/sql existente en la biblioteca estándar.