Introducción: ¿Por qué un desarrollador de C++ necesita bases de datos?
C++ es uno de los lenguajes de programación de sistemas más potentes. Sin embargo, incluso en proyectos de alta carga, rara vez se puede prescindir del almacenamiento de datos. Ya sea un servidor de juegos, una aplicación financiera o un sistema IoT, necesitará un almacenamiento confiable. En este artículo analizaremos dos enfoques populares: el sistema de gestión de bases de datos relacional PostgreSQL y el orientado a documentos MongoDB. Aprenderá cómo conectarlos a un proyecto en C++, realizar operaciones básicas y evitar errores típicos.
1. PostgreSQL en C++: el clásico de las bases de datos relacionales
PostgreSQL es un sistema de gestión de bases de datos maduro y confiable con excelente soporte para transacciones y consultas complejas. Para trabajar con él desde C++, se utiliza con mayor frecuencia la librería libpqxx, el envoltorio oficial de C++ sobre libpq.
Instalación y conexión
Instale libpqxx a través del gestor de paquetes o compílelo desde el código fuente:
# Ubuntu/Debiansudo apt-get install libpqxx-dev
# macOS (Homebrew)brew install libpqxxEn CMakeLists.txt agregue:
find_package(PQXX REQUIRED)target_link_libraries(your_project pqxx::pqxx)Conexión a la base de datos y un SELECT simple
Veamos un ejemplo mínimo: obtener una lista de usuarios:
#include <iostream>#include <pqxx/pqxx>
int main() { try { // Cadena de conexión: "host=... dbname=... user=... password=..." pqxx::connection conn("host=localhost dbname=testdb user=admin password=secret"); pqxx::work txn(conn);
// Ejecutamos la consulta pqxx::result result = txn.exec("SELECT id, name, email FROM users LIMIT 10");
for (auto row : result) { std::cout << "ID: " << row[0].as<int>() << ", Name: " << row[1].as<std::string>() << ", Email: " << row[2].as<std::string>() << std::endl; }
txn.commit(); // Finalizamos la transacción } catch (const std::exception &e) { std::cerr << "Error: " << e.what() << std::endl; return 1; } return 0;}Tenga en cuenta: todas las operaciones están envueltas en un bloque try-catch — libpqxx genera excepciones ante cualquier fallo.
Consultas parametrizadas (seguridad)
Nunca concatene cadenas para sustituir valores, ya que esto abre la puerta a inyecciones SQL. Utilice expresiones preparadas:
pqxx::work txn(conn);// Preparaciónconn.prepare("insert_user", "INSERT INTO users (name, email) VALUES ($1, $2)");
// Ejecución con parámetrostxn.exec_prepared("insert_user", "Iván Pérez", "ivan@example.com");txn.commit();2. MongoDB en C++: flexibilidad de NoSQL
MongoDB almacena datos en formato BSON (JSON binario) y es ideal para tareas donde el esquema de datos puede cambiar. El controlador oficial para C++ es mongocxx (sobre mongoc).
Instalación del controlador mongocxx
La compilación desde el código fuente es la forma más confiable. Instrucciones breves:
# Instale las dependencias: libmongoc, libbson, cmakegit clone https://github.com/mongodb/mongo-cxx-driver.gitcd mongo-cxx-driver/buildcmake .. -DCMAKE_BUILD_TYPE=Release -DBSONCXX_POLY_USE_MNMLSTC=ONmake -j4sudo make installEn CMakeLists.txt:
find_package(libmongocxx REQUIRED)target_link_libraries(your_project mongocxx::mongocxx)Conexión e inserción de un documento
#include <iostream>#include <bsoncxx/json.hpp>#include <mongocxx/client.hpp>#include <mongocxx/instance.hpp>#include <mongocxx/uri.hpp>
int main() { // Inicialización del controlador (una vez por aplicación) mongocxx::instance inst{};
// Con