ORM para C++: comparación y ejemplos de uso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course
```html

ORM para C++: comparación y ejemplos



En el mundo de C++, el trabajo con bases de datos históricamente ha sido de más bajo nivel que en lenguajes como Python o Java. Sin embargo, los proyectos modernos requieren comodidad y productividad, por lo que los desarrolladores recurren cada vez más a ORM (Object-Relational Mapping). ORM para C++ permite trabajar con tablas como si fueran objetos C++ comunes, generar consultas SQL automáticamente y gestionar migraciones de esquema. En este artículo, analizaremos cinco bibliotecas populares: ODB, SQLiteCpp, SOCI, cppdb y sqlpp11, compararemos sus características y proporcionaremos ejemplos prácticos.



1. ODB — el estándar empresarial



ODB es un potente framework ORM para C++ que soporta múltiples DBMS: MySQL, PostgreSQL, SQLite, Oracle, SQL Server. Su característica principal es la generación de código: describes el modelo en un archivo de cabecera con anotaciones, y el compilador ODB (odb) crea el código para trabajar con la base de datos.



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


Después de ejecutar odb -d mysql person.hxx se generan archivos con la implementación. Luego usamos el patrón estándar:



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


Ventajas: ORM completo, soporte de migraciones, lazy loading, trabajo con transacciones. Desventajas: configuración compleja, necesidad de generación de código, pesado para proyectos pequeños.



2. SQLiteCpp — ligereza y simplicidad



SQLiteCpp es un envoltorio sobre SQLite3 al estilo C++ RAII. No es un ORM completo, pero proporciona una interfaz conveniente para trabajar con consultas.



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


Ventajas: minimalista, no requiere generación de código, solo funciona con SQLite. Desventajas: sin mapeo de objetos, escritura manual de SQL.



3. SOCI — abstracción universal



SOCI (The C++ Database Access Library) no es un ORM puro, sino una abstracción sobre diferentes DBMS (SQLite, PostgreSQL, MySQL, Oracle). Proporciona una sintaxis conveniente para ejecutar consultas y vincular resultados con estructuras de 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