ORM pour C++ : comparaison et exemples d'utilisation

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

ORM pour C++ : comparaison et exemples



Dans le monde du C++, le travail avec les bases de données a historiquement été de plus bas niveau que dans des langages comme Python ou Java. Cependant, les projets modernes exigent confort et productivité, c'est pourquoi les développeurs se tournent de plus en plus vers les ORM (Object-Relational Mapping). Un ORM pour C++ permet de travailler avec des tables comme avec des objets C++ classiques, de générer automatiquement des requêtes SQL et de gérer les migrations de schéma. Dans cet article, nous examinerons cinq bibliothèques populaires : ODB, SQLiteCpp, SOCI, cppdb et sqlpp11, comparerons leurs caractéristiques et donnerons des exemples pratiques.



1. ODB — le standard d'entreprise



ODB est un framework ORM puissant pour C++ qui prend en charge de nombreux SGBD : MySQL, PostgreSQL, SQLite, Oracle, SQL Server. La principale caractéristique est la génération de code : vous décrivez le modèle dans un fichier d'en-tête avec des annotations, et le compilateur ODB (odb) crée le code pour interagir avec la base de données.



// person.hxx#pragma once#include <string>#include <odb/core.hxx>

#pragma db objectclass Person {public: Person() {} Person(const std::string& name, int age) : name_(name), age_(age) {}

const std::string& getName() const { return name_; } int getAge() const { return age_; }

private: friend class odb::access; #pragma db id auto unsigned long id_; std::string name_; int age_;};


Après avoir exécuté odb -d mysql person.hxx, des fichiers d'implémentation sont générés. Ensuite, on utilise le modèle standard :



#include <odb/database.hxx>#include <odb/mysql/database.hxx>#include "person-odb.hxx"

int main() { auto db = std::make_shared<odb::mysql::database>("user", "pass", "mydb"); Person p("Alice", 30); db->persist(p); // Chargement auto loaded = db->load<Person>(1); return 0;}


Avantages : ORM complet, support des migrations, lazy loading, gestion des transactions. Inconvénients : configuration complexe, nécessité de génération de code, lourdeur pour les petits projets.



2. SQLiteCpp — légèreté et simplicité



SQLiteCpp est une surcouche de SQLite3 dans le style RAII du C++. Ce n'est pas un ORM complet, mais il offre une interface pratique pour travailler avec les requêtes.



#include <SQLiteCpp/Database.h>#include <SQLiteCpp/Statement.h>

int main() { SQLite::Database db("test.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE); db.exec("CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY, name TEXT, age INT)"); SQLite::Statement insert(db, "INSERT INTO person (name, age) VALUES (?, ?)"); insert.bind(1, "Bob"); insert.bind(2, 25); insert.exec(); // Lecture SQLite::Statement query(db, "SELECT * FROM person WHERE age > ?"); query.bind(1, 20); while (query.executeStep()) { std::cout << query.getColumn(1) << " " << query.getColumn(2) << ""; } return 0;}


Avantages : minimaliste, ne nécessite pas de génération de code, fonctionne uniquement avec SQLite. Inconvénients : pas de mapping d'objets, écriture manuelle du SQL.



3. SOCI — abstraction universelle



SOCI (The C++ Database Access Library) n'est pas un ORM pur, mais une abstraction pour différents SGBD (SQLite, PostgreSQL, MySQL, Oracle). Il offre une syntaxe pratique pour exécuter des requêtes et lier les résultats à des structures C++.



#include <soci/soci.h>#include <soci/sqlite3.h>

struct Person { int id; std::string name; int age;};

int main() { soci::session sql(soci::sqlite3, "test.db"); sql << "CREATE TABLE person (id INTEGER PRIMARY KEY, name TEXT, age INT)"; Person p{1, "Charlie", 35}; sql << "INSERT INTO person (id, name, age) VALUES (:id, :name

Recommendations