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

go get github.com/mattn/go-sqlite3

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

  1. Crea una base de datos SQLite llamada test.db.
  2. Crea una tabla llamada users con las columnas id, name y age.
  3. Implementa las funciones createRecord, readRecords, updateRecord y deleteRecord en un programa Go.
  4. Inserta varios registros en la tabla users.
  5. Lee y muestra todos los registros.
  6. Actualiza uno de los registros.
  7. 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.

© Copyright 2024. Todos los derechos reservados