ORM für C++: Vergleich und Anwendungsbeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

ORM für C++: Vergleich und Beispiele



In der Welt von C++ war die Arbeit mit Datenbanken historisch gesehen auf niedrigerem Niveau als in Sprachen wie Python oder Java. Moderne Projekte erfordern jedoch Komfort und Produktivität, weshalb Entwickler zunehmend auf ORM (Object-Relational Mapping) zurückgreifen. ORM für C++ ermöglicht es, mit Tabellen wie mit gewöhnlichen C++-Objekten zu arbeiten, SQL-Abfragen automatisch zu generieren und Schema-Migrationen zu verwalten. In diesem Artikel betrachten wir fünf beliebte Bibliotheken: ODB, SQLiteCpp, SOCI, cppdb und sqlpp11, vergleichen ihre Eigenschaften und geben praktische Beispiele.



1. ODB — Unternehmensstandard



ODB ist ein leistungsstarkes ORM-Framework für C++, das viele DBMS unterstützt: MySQL, PostgreSQL, SQLite, Oracle, SQL Server. Die Hauptfunktion ist die Codegenerierung: Sie beschreiben das Modell in einer Header-Datei mit Annotationen, und der ODB-Compiler (odb) erstellt den Code für die Datenbankarbeit.



// 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_;};


Nach dem Ausführen von odb -d mysql person.hxx werden Dateien mit der Implementierung generiert. Anschließend verwenden wir das Standardmuster:



#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); // Laden auto loaded = db->load<Person>(1); return 0;}


Vorteile: vollständiges ORM, Unterstützung für Migrationen, Lazy Loading, Transaktionsverwaltung. Nachteile: komplexe Einrichtung, Notwendigkeit der Codegenerierung, Schwerfälligkeit für kleine Projekte.



2. SQLiteCpp — Leichtigkeit und Einfachheit



SQLiteCpp ist ein Wrapper um SQLite3 im C++-RAII-Stil. Es ist kein vollwertiges ORM, bietet aber eine bequeme Schnittstelle für die Arbeit mit Abfragen.



#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(); // Lesen 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;}


Vorteile: Minimalismus, keine Codegenerierung erforderlich, funktioniert nur mit SQLite. Nachteile: kein Objekt-Mapping, manuelles SQL-Schreiben.



3. SOCI — universeller Abstraktor



SOCI (The C++ Database Access Library) ist kein reines ORM, sondern eine Abstraktion über verschiedene DBMS (SQLite, PostgreSQL, MySQL, Oracle). Es bietet eine bequeme Syntax zum Ausführen von Abfragen und zum Binden von Ergebnissen an C++-Strukturen.



#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

Empfehlungen