Travailler avec les bases de données en C++ : PostgreSQL et MongoDB
Les applications modernes en C++ ne se passent que rarement d'interaction avec les bases de données. Que vous développiez un serveur à forte charge, un système d'analyse ou un logiciel embarqué, savoir travailler avec des SGBD relationnels (PostgreSQL) et orientés documents (MongoDB) est une compétence obligatoire. Dans cet article, nous aborderons la connexion, l'exécution de requêtes et la gestion des erreurs pour les deux systèmes à l'aide d'exemples pratiques.
1. Préparation de l'environnement et choix des bibliothèques
Pour travailler avec PostgreSQL en C++, la bibliothèque de facto est libpqxx. Pour MongoDB, le pilote officiel est mongocxx (basé sur libmongoc).
Installation de libpqxx (Linux / macOS)
# Ubuntu / Debiansudo apt-get install libpqxx-dev
# macOS (Homebrew)brew install libpqxxInstallation de mongocxx (Linux / macOS)
# Nécessite d'installer préalablement libmongoc et boostsudo apt-get install libmongoc-1.0-0 libbson-1.0 libmongocxx-dev
# macOSbrew install mongo-cxx-driverPour Windows, utilisez vcpkg ou téléchargez des builds précompilés depuis les dépôts officiels.
2. Travailler avec PostgreSQL via libpqxx
La bibliothèque libpqxx fournit une interface C++ pratique au-dessus du pilote C libpq. Les classes principales sont : connection, work (transaction), result.
Connexion à la base de données
#include <iostream>#include <pqxx/pqxx>
int main() { try { // Chaîne de connexion : "dbname=test user=postgres password=secret hostaddr=127.0.0.1 port=5432" pqxx::connection conn("dbname=testdb user=myuser password=mypass hostaddr=localhost"); if (conn.is_open()) { std::cout << "Connected to PostgreSQL: " << conn.dbname() << std::endl; } } catch (const std::exception &e) { std::cerr << "Connection error: " << e.what() << std::endl; return 1; } return 0;}Exécution de requêtes (CRUD)
void createTable(pqxx::connection &conn) { pqxx::work txn(conn); txn.exec("CREATE TABLE IF NOT EXISTS users (" "id SERIAL PRIMARY KEY," "name VARCHAR(100) NOT NULL," "email VARCHAR(255) UNIQUE," "age INT" ")"); txn.commit();}
void insertUser(pqxx::connection &conn, const std::string &name, const std::string &email, int age) { pqxx::work txn(conn); // Utilisation d'une requête paramétrée pour se protéger des injections SQL txn.exec_params("INSERT INTO users (name, email, age) VALUES ($1, $2, $3)", name, email, age); txn.commit(); std::cout << "User inserted." << std::endl;}
void selectUsers(pqxx::connection &conn) { pqxx::nontransaction txn(conn); pqxx::result result = txn.exec("SELECT id, name, email, age FROM users"); for (auto row : result) { std::cout << "ID: " << row["id"].as<int>() << ", Name: " << row["name"].as<std::string>() << ", Email: " << row["email"].as<std::string>() << ", Age: " << row["age"].as<int>() << std::endl; }}Gestion des erreurs
Enveloppez toutes les opérations dans un try-catch. libpqxx génère des exceptions des classes pqxx::sql_error, pqxx::broken_connection et autres.
3. Travailler avec MongoDB via mongocxx
Le pilote mongocxx utilise le C++17 moderne. Les entités principales sont : client, database, collection, document (via bsoncxx).
Connexion et obtention de la collection
#include <ios