En este módulo, aprenderás cómo conectar una aplicación Go a una base de datos. Este es un paso crucial para cualquier aplicación que necesite almacenar y recuperar datos de manera persistente. Utilizaremos la biblioteca database/sql estándar de Go y el controlador go-sql-driver/mysql para conectarnos a una base de datos MySQL.

Objetivos del Tema

  • Entender cómo funciona la biblioteca database/sql.
  • Configurar una conexión a una base de datos MySQL.
  • Ejecutar consultas básicas para interactuar con la base de datos.

Requisitos Previos

  • Conocimientos básicos de SQL.
  • Tener una base de datos MySQL instalada y en funcionamiento.
  • Haber completado los módulos anteriores del curso.

Paso 1: Instalación del Controlador MySQL

Primero, necesitamos instalar el controlador MySQL para Go. Abre tu terminal y ejecuta el siguiente comando:

go get -u github.com/go-sql-driver/mysql

Este comando descargará e instalará el controlador MySQL necesario para que Go pueda comunicarse con una base de datos MySQL.

Paso 2: Importar las Bibliotecas Necesarias

En tu archivo Go, importa las bibliotecas database/sql y el controlador MySQL que acabamos de instalar:

package main

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

Nota: El guion bajo (_) antes del nombre del paquete github.com/go-sql-driver/mysql indica que estamos importando el paquete solo por sus efectos secundarios (registro del controlador).

Paso 3: Configurar la Conexión a la Base de Datos

A continuación, configuraremos la conexión a la base de datos. Necesitarás los siguientes detalles:

  • Nombre de usuario de la base de datos
  • Contraseña
  • Nombre del host (por ejemplo, localhost)
  • Nombre de la base de datos

Aquí hay un ejemplo de cómo configurar la conexión:

func main() {
    // Configuración de la cadena de conexión
    dsn := "usuario:contraseña@tcp(localhost:3306)/nombre_base_datos"

    // Abrir una conexión a la base de datos
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        fmt.Println("Error al abrir la base de datos:", err)
        return
    }
    defer db.Close()

    // Verificar la conexión
    err = db.Ping()
    if err != nil {
        fmt.Println("Error al conectar a la base de datos:", err)
        return
    }

    fmt.Println("Conexión exitosa a la base de datos")
}

Explicación del Código

  • sql.Open("mysql", dsn): Abre una conexión a la base de datos utilizando el controlador MySQL y la cadena de conexión (DSN - Data Source Name).
  • db.Ping(): Verifica que la conexión a la base de datos sea exitosa.
  • defer db.Close(): Asegura que la conexión a la base de datos se cierre cuando la función main termine.

Paso 4: Ejecutar Consultas Básicas

Una vez que la conexión esté configurada, podemos ejecutar consultas SQL. Aquí hay un ejemplo de cómo ejecutar una consulta SELECT:

func main() {
    dsn := "usuario:contraseña@tcp(localhost:3306)/nombre_base_datos"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        fmt.Println("Error al abrir la base de datos:", err)
        return
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        fmt.Println("Error al conectar a la base de datos:", err)
        return
    }

    // Ejecutar una consulta SELECT
    rows, err := db.Query("SELECT id, nombre FROM usuarios")
    if err != nil {
        fmt.Println("Error al ejecutar la consulta:", err)
        return
    }
    defer rows.Close()

    // Iterar sobre los resultados
    for rows.Next() {
        var id int
        var nombre string
        err := rows.Scan(&id, &nombre)
        if err != nil {
            fmt.Println("Error al escanear la fila:", err)
            return
        }
        fmt.Printf("ID: %d, Nombre: %s\n", id, nombre)
    }

    // Verificar errores de iteración
    if err = rows.Err(); err != nil {
        fmt.Println("Error durante la iteración:", err)
    }
}

Explicación del Código

  • db.Query("SELECT id, nombre FROM usuarios"): Ejecuta una consulta SELECT y devuelve las filas resultantes.
  • rows.Next(): Itera sobre cada fila en el resultado.
  • rows.Scan(&id, &nombre): Escanea los valores de la fila actual en las variables id y nombre.
  • rows.Close(): Cierra el conjunto de resultados una vez que hemos terminado de iterar sobre ellos.
  • rows.Err(): Verifica si hubo algún error durante la iteración.

Ejercicio Práctico

Ejercicio

  1. Configura una base de datos MySQL con una tabla llamada productos que tenga las siguientes columnas: id (INT), nombre (VARCHAR), precio (FLOAT).
  2. Escribe un programa en Go que se conecte a esta base de datos y ejecute una consulta SELECT para obtener todos los productos.
  3. Imprime los resultados en la consola.

Solución

package main

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

func main() {
    dsn := "usuario:contraseña@tcp(localhost:3306)/nombre_base_datos"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        fmt.Println("Error al abrir la base de datos:", err)
        return
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        fmt.Println("Error al conectar a la base de datos:", err)
        return
    }

    rows, err := db.Query("SELECT id, nombre, precio FROM productos")
    if err != nil {
        fmt.Println("Error al ejecutar la consulta:", err)
        return
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var nombre string
        var precio float64
        err := rows.Scan(&id, &nombre, &precio)
        if err != nil {
            fmt.Println("Error al escanear la fila:", err)
            return
        }
        fmt.Printf("ID: %d, Nombre: %s, Precio: %.2f\n", id, nombre, precio)
    }

    if err = rows.Err(); err != nil {
        fmt.Println("Error durante la iteración:", err)
    }
}

Conclusión

En este tema, hemos aprendido cómo conectar una aplicación Go a una base de datos MySQL utilizando la biblioteca database/sql y el controlador go-sql-driver/mysql. También hemos visto cómo ejecutar consultas básicas y manejar los resultados. En el próximo tema, exploraremos cómo realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) en la base de datos.

¡Felicidades por llegar hasta aquí! Ahora estás listo para avanzar al siguiente tema y profundizar en el manejo de bases de datos con Go.

© Copyright 2024. Todos los derechos reservados