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 Auch in der Bibliothek
Dapper C# (.NET): Komplette Anleitung mit Beispielen
Chucker für Kotlin: Komplettguide mit Beispielen
Bibliothek cpp-httplib: OAuth 2.0-Client in C++ für Webanwendungen
SMS-Versand mit PHP: API-Bibliotheken von sms.ru und anderen Diensten
Überwachung von Go-Anwendungen (Golang): Bibliotheken und Tools