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:
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:
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ónmain
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 consultaSELECT
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 variablesid
ynombre
.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
- Configura una base de datos MySQL con una tabla llamada
productos
que tenga las siguientes columnas:id
(INT),nombre
(VARCHAR),precio
(FLOAT). - Escribe un programa en Go que se conecte a esta base de datos y ejecute una consulta
SELECT
para obtener todos los productos. - 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.
Curso de Programación en Go
Módulo 1: Introducción a Go
- Introducción a Go
- Configuración del Entorno de Go
- Tu Primer Programa en Go
- Sintaxis y Estructura Básica
Módulo 2: Conceptos Básicos
Módulo 3: Estructuras de Datos Avanzadas
Módulo 4: Manejo de Errores
Módulo 5: Concurrencia
Módulo 6: Temas Avanzados
Módulo 7: Desarrollo Web con Go
Módulo 8: Trabajando con Bases de Datos
Módulo 9: Despliegue y Mantenimiento
- Construcción y Despliegue de Aplicaciones Go
- Registro de Logs
- Monitoreo y Optimización de Rendimiento
- Mejores Prácticas de Seguridad