Introducción: ¿por qué un desarrollador de C++ necesita bases de datos?
C++ es uno de los lenguajes de programación más potentes, utilizado para crear sistemas de alta carga, juegos, aplicaciones financieras y software embebido. Sin embargo, cualquier aplicación seria requiere almacenamiento de datos. Aquí es donde entran en acción los sistemas de gestión de bases de datos (DBMS).
En este artículo, analizaremos cómo conectarse y realizar operaciones básicas con dos DBMS populares — PostgreSQL relacional y MongoDB orientado a documentos — usando C++. El material está dirigido a desarrolladores principiantes que ya conocen los fundamentos de C++, pero aún no han trabajado con bases de datos. Aprenderá cómo instalar las bibliotecas necesarias, escribir consultas CRUD simples y evitar errores típicos.
1. Preparación del entorno y selección de bibliotecas
Antes de escribir código, es necesario instalar las bibliotecas cliente para trabajar con bases de datos. Para C++ existen varias opciones, pero consideraremos las más populares y estables:
- Para PostgreSQL —
libpqxx(envoltura oficial de C++ sobre libpq). - Para MongoDB —
mongocxx(controlador oficial de C++ de MongoDB).
Instalación de libpqxx (Ubuntu/Debian)
sudo apt-get updatesudo apt-get install libpqxx-devPara Windows o macOS, use los gestores de paquetes vcpkg o Homebrew.
Instalación de mongocxx
Primero instale el controlador base mongo-c-driver, luego el controlador de C++:
# Ubuntusudo apt-get install libmongoc-dev libbson-devsudo apt-get install libmongocxx-devDespués de la instalación, asegúrese de que el compilador vea los archivos de cabecera. Al compilar, no olvide especificar las banderas de enlace:
g++ -std=c++17 main.cpp -lpqxx -lpq -lmongocxx -lbson2. Trabajo con PostgreSQL en C++
PostgreSQL es un potente DBMS objeto-relacional. Usaremos la biblioteca libpqxx, que proporciona una interfaz conveniente de C++.
Conexión al servidor y creación de tabla
Primero escribamos un programa simple que se conecte a una base de datos local y cree una tabla de usuarios:
#include <iostream>#include <pqxx/pqxx>
int main() { try { // Nos conectamos a la base de datos "testdb" con el usuario "postgres" pqxx::connection conn("host=localhost dbname=testdb user=postgres password=secret"); if (conn.is_open()) { std::cout << "¡Conexión a PostgreSQL exitosa!" << std::endl; }
// Creamos una transacción pqxx::work txn(conn);
// Consulta SQL para crear la tabla txn.exec("CREATE TABLE IF NOT EXISTS users (" "id SERIAL PRIMARY KEY," "name VARCHAR(100) NOT NULL," "email VARCHAR(100) UNIQUE NOT NULL);");
txn.commit(); // Confirmamos los cambios std::cout << "Tabla users creada." << std::endl;
} catch (const std::exception &e) { std::cerr << "Error: " << e.what() << std::endl; } return 0;}Operaciones CRUD: inserción y lectura de datos
Agreguemos algunos registros y realicemos una consulta:
pqxx::work txn(conn);
// Inserción de datostxn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);", "Iván Petrov", "ivan@example.com");txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);", "María Smirnova", "maria@example.com");txn.commit();
// Lectura de datospqxx::nontransaction ntxn(conn);pqxx::result result = ntxn.exec("SELECT id, name, email FROM users;");
for (auto row : result) { std::cout << "ID: " << row[0].as<int>() << ", Nombre: " << row[1].as<std::string>() << ", Email: " <<