En este tema, aprenderemos cómo realizar operaciones CRUD (Crear, Leer, Actualizar y Eliminar) en una base de datos utilizando Go. Estas operaciones son fundamentales para cualquier aplicación que maneje datos persistentes.
Objetivos del Tema
- Entender qué son las operaciones CRUD.
- Aprender a realizar operaciones CRUD en una base de datos usando Go.
- Practicar con ejemplos prácticos y ejercicios.
Conceptos Clave
¿Qué son las Operaciones CRUD?
CRUD es un acrónimo que representa las cuatro operaciones básicas que se pueden realizar en una base de datos:
- Crear (Create): Insertar nuevos registros en la base de datos.
- Leer (Read): Consultar y recuperar datos de la base de datos.
- Actualizar (Update): Modificar registros existentes en la base de datos.
- Eliminar (Delete): Borrar registros de la base de datos.
Configuración Inicial
Antes de comenzar con las operaciones CRUD, asegúrate de tener configurado tu entorno de desarrollo y una base de datos a la que puedas conectarte. Para este ejemplo, utilizaremos una base de datos SQLite.
Instalación de SQLite
# En sistemas basados en Debian/Ubuntu sudo apt-get install sqlite3 # En sistemas basados en Red Hat/Fedora sudo dnf install sqlite # En macOS brew install sqlite
Instalación del Driver SQLite para Go
Conexión a la Base de Datos
Primero, necesitamos establecer una conexión con la base de datos. Aquí hay un ejemplo de cómo hacerlo:
package main import ( "database/sql" "log" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "./test.db") if err != nil { log.Fatal(err) } defer db.Close() // Verificar la conexión err = db.Ping() if err != nil { log.Fatal(err) } log.Println("Conexión exitosa a la base de datos") }
Crear (Create)
Para insertar un nuevo registro en la base de datos, utilizamos la instrucción INSERT INTO
.
Ejemplo de Crear
func createRecord(db *sql.DB) { query := `INSERT INTO users (name, age) VALUES (?, ?)` _, err := db.Exec(query, "John Doe", 30) if err != nil { log.Fatal(err) } log.Println("Registro creado exitosamente") }
Leer (Read)
Para consultar y recuperar datos de la base de datos, utilizamos la instrucción SELECT
.
Ejemplo de Leer
func readRecords(db *sql.DB) { query := `SELECT id, name, age FROM users` rows, err := db.Query(query) if err != nil { log.Fatal(err) } defer rows.Close() for rows.Next() { var id int var name string var age int err = rows.Scan(&id, &name, &age) if err != nil { log.Fatal(err) } log.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age) } }
Actualizar (Update)
Para modificar registros existentes en la base de datos, utilizamos la instrucción UPDATE
.
Ejemplo de Actualizar
func updateRecord(db *sql.DB) { query := `UPDATE users SET age = ? WHERE name = ?` _, err := db.Exec(query, 31, "John Doe") if err != nil { log.Fatal(err) } log.Println("Registro actualizado exitosamente") }
Eliminar (Delete)
Para borrar registros de la base de datos, utilizamos la instrucción DELETE
.
Ejemplo de Eliminar
func deleteRecord(db *sql.DB) { query := `DELETE FROM users WHERE name = ?` _, err := db.Exec(query, "John Doe") if err != nil { log.Fatal(err) } log.Println("Registro eliminado exitosamente") }
Ejercicio Práctico
Ejercicio
- Crea una base de datos SQLite llamada
test.db
. - Crea una tabla llamada
users
con las columnasid
,name
yage
. - Implementa las funciones
createRecord
,readRecords
,updateRecord
ydeleteRecord
en un programa Go. - Inserta varios registros en la tabla
users
. - Lee y muestra todos los registros.
- Actualiza uno de los registros.
- Elimina uno de los registros.
Solución
package main import ( "database/sql" "log" _ "github.com/mattn/go-sqlite3" ) func main() { db, err := sql.Open("sqlite3", "./test.db") if err != nil { log.Fatal(err) } defer db.Close() createTable(db) createRecord(db) readRecords(db) updateRecord(db) readRecords(db) deleteRecord(db) readRecords(db) } func createTable(db *sql.DB) { query := ` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER );` _, err := db.Exec(query) if err != nil { log.Fatal(err) } log.Println("Tabla creada exitosamente") } func createRecord(db *sql.DB) { query := `INSERT INTO users (name, age) VALUES (?, ?)` _, err := db.Exec(query, "John Doe", 30) if err != nil { log.Fatal(err) } log.Println("Registro creado exitosamente") } func readRecords(db *sql.DB) { query := `SELECT id, name, age FROM users` rows, err := db.Query(query) if err != nil { log.Fatal(err) } defer rows.Close() for rows.Next() { var id int var name string var age int err = rows.Scan(&id, &name, &age) if err != nil { log.Fatal(err) } log.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age) } } func updateRecord(db *sql.DB) { query := `UPDATE users SET age = ? WHERE name = ?` _, err := db.Exec(query, 31, "John Doe") if err != nil { log.Fatal(err) } log.Println("Registro actualizado exitosamente") } func deleteRecord(db *sql.DB) { query := `DELETE FROM users WHERE name = ?` _, err := db.Exec(query, "John Doe") if err != nil { log.Fatal(err) } log.Println("Registro eliminado exitosamente") }
Conclusión
En esta sección, hemos aprendido cómo realizar operaciones CRUD en una base de datos utilizando Go. Estas operaciones son esenciales para cualquier aplicación que maneje datos persistentes. Asegúrate de practicar estos conceptos y experimentar con diferentes tipos de bases de datos para fortalecer tu comprensión.
En el próximo módulo, exploraremos cómo usar ORM (Object-Relational Mapping) para simplificar las interacciones con la base de datos.
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