Introduction : Pourquoi connecter des bases de données à C++
Les applications modernes en C++ se passent rarement d'un stockage permanent de données. Qu'il s'agisse d'un serveur de jeu, d'un système de télémétrie ou d'un backend à forte charge, vous aurez besoin d'interagir avec un SGBD. Deux approches fondamentalement différentes dominent le marché : les bases de données relationnelles (SQL) et les bases de données orientées documents (NoSQL).
Dans cet article, nous allons voir comment travailler avec PostgreSQL (via la bibliothèque libpqxx) et MongoDB (via le pilote C++ officiel mongo-cxx-driver). Vous apprendrez à configurer la connexion, à effectuer des opérations CRUD et à gérer les erreurs.
1. PostgreSQL et C++ : l'approche relationnelle
PostgreSQL est un SGBD objet-relationnel puissant avec un excellent support des transactions et des requêtes complexes. Pour C++, il est recommandé d'utiliser la bibliothèque libpqxx, une enveloppe moderne et type-safe au-dessus de libpq.
1.1 Installation de libpqxx
L'installation dépend de votre système d'exploitation :
- Ubuntu/Debian :
sudo apt install libpqxx-dev - macOS (Homebrew) :
brew install libpqxx - Windows (vcpkg) :
vcpkg install libpqxx
1.2 Connexion et exécution de requêtes
Considérons un programme minimal pour se connecter à la base de données, créer une table et insérer des données :
#include <iostream>#include <pqxx/pqxx>
int main() { try { // Connexion à la base de données pqxx::connection conn("dbname=testdb user=postgres password=secret hostaddr=127.0.0.1 port=5432"); if (conn.is_open()) { std::cout << "Connected to PostgreSQL: " << conn.dbname() << std::endl; }
// Création d'une transaction pqxx::work txn(conn);
// Création de la table txn.exec("CREATE TABLE IF NOT EXISTS users (" "id SERIAL PRIMARY KEY," "name VARCHAR(100) NOT NULL," "email VARCHAR(255) UNIQUE NOT NULL" ");");
// Insertion de données (avec paramétrage pour la sécurité) txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);", "Alice", "alice@example.com");
// Validation de la transaction txn.commit();
std::cout << "Data inserted successfully." << std::endl;
} catch (const std::exception &e) { std::cerr << "Error: " << e.what() << std::endl; return 1; } return 0;}1.3 Lecture des données
Pour la sélection de données, utilisez les itérateurs sur le résultat de la requête :
pqxx::work txn(conn);pqxx::result result = txn.exec("SELECT id, name, email FROM users;");
for (auto row : result) { int id = row["id"].as<int>(); std::string name = row["name"].as<std::string>(); std::string email = row["email"].as<std::string>(); std::cout << id << ": " << name << " <" << email << ">" << std::endl;}2. MongoDB et C++ : l'approche orientée documents
MongoDB stocke les données au format BSON (JSON binaire). Pour C++, on utilise le pilote officiel mongo-cxx-driver, construit sur la bibliothèque libmongoc.
2.1 Installation de mongo-cxx-driver
- Ubuntu :
sudo apt install libmongoc-1.0-0 libbson-1.0-0 libmongocxx-dev - macOS :
brew install mongo-cxx-driver - Compilation à partir des sources : Nécessite
cmake,libmongocetlibbson.
2.2 Connexion et opérations CRUD
Exemple de connexion à une instance MongoDB locale et d'insertion d'un document :
#include <iostream>#include <bsoncxx/b