Trabajo con bases de datos en Go: PostgreSQL y MongoDB para principiantes
Go (Golang) es un lenguaje compilado moderno que ha ganado popularidad gracias a su alto rendimiento, simplicidad y soporte integrado para concurrencia. Al desarrollar servicios web y aplicaciones, casi siempre surge la necesidad de interactuar con bases de datos. En este artículo, veremos cómo trabajar con dos SGBD populares: PostgreSQL relacional y MongoDB orientado a documentos. El material está dirigido a desarrolladores principiantes que ya están familiarizados con los conceptos básicos de Go.
1. Preparación del entorno e instalación de drivers
Antes de comenzar, asegúrate de tener Go instalado (versión 1.16+) y los SGBD correspondientes en ejecución. Para trabajar con PostgreSQL, necesitarás el driver lib/pq, y para MongoDB, el driver oficial mongo-go-driver.
go get github.com/lib/pqgo get go.mongodb.org/mongo-driver/mongoCrea un nuevo módulo:
go mod init example.com/db-demo2. Trabajo con PostgreSQL en Go
PostgreSQL es una potente base de datos relacional con soporte para SQL. En Go, usamos el paquete estándar database/sql junto con el driver lib/pq.
2.1 Conexión a la base de datos
Para conectarse, es necesario especificar la cadena de conexión (DSN) en el formato: host=... port=... user=... password=... dbname=... sslmode=disable.
package main
import ( "database/sql" "fmt" "log" _ "github.com/lib/pq")
func main() { connStr := "host=localhost port=5432 user=postgres password=secret dbname=testdb sslmode=disable" db, err := sql.Open("postgres", connStr) if err != nil { log.Fatal(err) } defer db.Close()
err = db.Ping() if err != nil { log.Fatal("No se pudo conectar:", err) } fmt.Println("¡Conexión a PostgreSQL establecida!")}2.2 Creación de tabla y operaciones CRUD
Veamos la creación de la tabla users y la realización de operaciones básicas.
// Creación de tablacreateTable := `CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT);`
_, err = db.Exec(createTable)if err != nil { log.Fatal(err)}
// Inserción de datossqlInsert := `INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id`var userID interr = db.QueryRow(sqlInsert, "Iván Petrov", "ivan@example.com", 30).Scan(&userID)if err != nil { log.Fatal(err)}fmt.Printf("Usuario agregado con ID: %d", userID)
// Consulta de datosrows, err := db.Query("SELECT id, name, email, age FROM users")if err != nil { log.Fatal(err)}defer rows.Close()
for rows.Next() { var u struct { ID int Name string Email string Age int } err := rows.Scan(&u.ID, &u.Name, &u.Email, &u.Age) if err != nil { log.Fatal(err) } fmt.Printf("ID: %d, Nombre: %s, Email: %s, Edad: %d", u.ID, u.Name, u.Email, u.Age)}2.3 Uso de consultas preparadas
Las consultas preparadas (prepared statements) mejoran la seguridad y el rendimiento, especialmente en operaciones repetitivas.
stmt, err := db.Prepare("UPDATE users SET age = $1 WHERE id = $2")if err != nil { log.Fatal(err)}defer stmt.Close()
_, err = stmt.Exec(35, 1)if err != nil { log.Fatal(err)}fmt.Println("Edad del usuario actualizada")3. Trabajo con MongoDB en Go
MongoDB es una base de datos NoSQL orientada a documentos. En Go, se trabaja con ella a través del driver oficial mongo-go-driver, que utiliza contextos para gestionar el tiempo de ejecución de las operaciones.
3.1 Conexión a MongoDB
pa