Introducción: Por qué Go y las bases de datos son una pareja ideal
Go (Golang) es un lenguaje compilado, tipado estáticamente, creado para alto rendimiento y simplicidad de desarrollo. Una de las ventajas clave de Go es su rica biblioteca estándar y ecosistema de drivers para trabajar con bases de datos. En este artículo, analizaremos cómo conectarse y realizar operaciones con los dos sistemas de gestión de bases de datos (SGBD) más populares: la relacional PostgreSQL y la orientada a documentos MongoDB.
Revisaremos la instalación de drivers, la escritura de operaciones CRUD (Create, Read, Update, Delete) y las mejores prácticas para cada tipo de BD en el contexto de aplicaciones Go.
1. Trabajando con PostgreSQL en Go
PostgreSQL es un potente SGBD objeto-relacional de código abierto. Para trabajar con él en Go existen varios drivers, pero los más populares son lib/pq y pgx. pgx es más moderno y eficiente, por lo que lo usaremos.
1.1. Instalación del driver
Instale el paquete pgx mediante go get:
go get github.com/jackc/pgx/v51.2. Conexión a la base de datos
Creemos un archivo main.go y establezcamos una conexión con PostgreSQL. Observe el uso del contexto (context.Background()) — este es un patrón estándar en Go para gestionar el tiempo de vida de las solicitudes.
package main
import ( "context" "fmt" "log"
"github.com/jackc/pgx/v5/pgxpool")
func main() { // Cadena de conexión: postgres://username:password@host:port/dbname connString := "postgres://user:password@localhost:5432/mydb" // Creamos un pool de conexiones (recomendado para producción) pool, err := pgxpool.New(context.Background(), connString) if err != nil { log.Fatal("No se pudo crear el pool de conexiones:", err) } defer pool.Close() // Verificamos la conexión err = pool.Ping(context.Background()) if err != nil { log.Fatal("No se pudo conectar a la BD:", err) } fmt.Println("¡Conectado exitosamente a PostgreSQL!")}1.3. Ejecución de consultas SQL (CRUD)
Veamos las operaciones básicas con el ejemplo de la tabla users.
Creación de tabla (CREATE)
// Ejecución de consulta DDL_, err = pool.Exec(context.Background(), ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT )`)if err != nil { log.Fatal("Error al crear la tabla:", err)}Inserción de datos (INSERT)
// Inserción con retorno de IDvar userID interr = pool.QueryRow(context.Background(), "INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id", "Alexei", "alex@example.com", 30).Scan(&userID)if err != nil { log.Fatal("Error al insertar:", err)}fmt.Printf("Usuario agregado con ID: %d", userID)Lectura de datos (SELECT)
// Obtener un usuariotype User struct { ID int Name string Email string Age int}
var user Usererr = pool.QueryRow(context.Background(), "SELECT id, name, email, age FROM users WHERE id = $1", 1). Scan(&user.ID, &user.Name, &user.Email, &user.Age)if err != nil { log.Fatal("Usuario no encontrado:", err)}fmt.Printf("Encontrado: %+v", user)Actualización y eliminación (UPDATE/DELETE)
// Actualización_, err = pool.Exec(context.Background(), "UPDATE users SET age = $1 WHERE id = $2", 31, 1)
// Eliminación_, err = pool.Exec(context.Background(), "DELETE FROM users WHERE id = $1", 1)2. Trabajando con MongoDB en Go
MongoDB es la base de datos NoSQL líder. Almacena