Introduction : Pourquoi un développeur C++ a-t-il besoin de bases de données ?
C++ est l'un des langages de programmation système les plus puissants. Cependant, même dans les projets à forte charge, il est rare de se passer de la persistance des données. Qu'il s'agisse d'un serveur de jeu, d'une application financière ou d'un système IoT, vous aurez besoin d'un stockage fiable. Dans cet article, nous aborderons deux approches populaires : le SGBD relationnel PostgreSQL et le système orienté documents MongoDB. Vous apprendrez à les connecter à un projet C++, à effectuer des opérations de base et à éviter les erreurs typiques.
1. PostgreSQL en C++ : le classique des BDD relationnelles
PostgreSQL est un SGBD mature et fiable avec un excellent support des transactions et des requêtes complexes. Pour l'utiliser depuis C++, on utilise le plus souvent la bibliothèque libpqxx — le wrapper C++ officiel autour de libpq.
Installation et connexion
Installez libpqxx via le gestionnaire de paquets ou compilez-le depuis les sources :
# Ubuntu/Debiansudo apt-get install libpqxx-dev
# macOS (Homebrew)brew install libpqxxDans CMakeLists.txt, ajoutez :
find_package(PQXX REQUIRED)target_link_libraries(your_project pqxx::pqxx)Connexion à la base et SELECT simple
Voici un exemple minimal — récupération de la liste des utilisateurs :
#include <iostream>#include <pqxx/pqxx>
int main() { try { // Chaîne de connexion : "host=... dbname=... user=... password=..." pqxx::connection conn("host=localhost dbname=testdb user=admin password=secret"); pqxx::work txn(conn);
// Exécution de la requête 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(); // Finalisation de la transaction } catch (const std::exception &e) { std::cerr << "Erreur : " << e.what() << std::endl; return 1; } return 0;}Notez que toutes les opérations sont encapsulées dans un bloc try-catch — libpqxx génère des exceptions en cas de panne.
Requêtes paramétrées (sécurité)
Ne concaténez jamais de chaînes pour substituer des valeurs — cela ouvre la voie aux injections SQL. Utilisez des expressions préparées :
pqxx::work txn(conn);// Préparationconn.prepare("insert_user", "INSERT INTO users (name, email) VALUES ($1, $2)");
// Exécution avec paramètrestxn.exec_prepared("insert_user", "Ivan Petrov", "ivan@example.com");txn.commit();2. MongoDB en C++ : la flexibilité du NoSQL
MongoDB stocke les données au format BSON (JSON binaire) et est parfait pour les cas où le schéma des données peut changer. Le pilote officiel pour C++ est mongocxx (basé sur mongoc).
Installation du pilote mongocxx
La compilation depuis les sources est la méthode la plus fiable. Instructions rapides :
# Installez les dépendances : 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 installDans CMakeLists.txt :
find_package(libmongocxx REQUIRED)target_link_libraries(your_project mongocxx::mongocxx)Connexion et insertion d'un document
#include <iostream>#include <bsoncxx/json.hpp>#include <mongocxx/client.hpp>#include <mongocxx/instance.hpp>#include <mongocxx/uri.hpp>
int main() { // Initialisation du pilote (une fois par application) mongocxx::instance inst{};
// Con