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

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

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



En el desarrollo moderno con C++, trabajar con bases de datos a menudo requiere un equilibrio entre rendimiento y comodidad. A diferencia de los lenguajes con un rico ecosistema de ORM (como Python o Java), C++ ofrece una selección más limitada pero madura de herramientas. En este artículo, compararemos cuatro bibliotecas populares: ODB, SQLiteCpp, Soci y sqlpp11. Analizaremos su arquitectura, sintaxis, rendimiento y ejemplos de código.



1. ODB — estándar industrial

ODB es un compilador ORM completo para C++. Genera código a partir de archivos de encabezado, admite bases de datos relacionales (MySQL, PostgreSQL, SQLite, Oracle) y proporciona un potente mapeo objeto-relacional.



Características clave:

  • Generación automática de código mediante precompilador (odb)
  • Soporte para herencia, polimorfismo, contenedores STL
  • Carga diferida, almacenamiento en caché, transacciones


Ejemplo: modelo y consulta

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

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

const std::string& name() const { return name_; } int age() const { return age_; }

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


// main.cpp#include <odb/database.hxx>#include <odb/sqlite/database.hxx>#include "person.hxx"#include "person-odb.hxx"

int main() { auto db = std::make_shared<odb::sqlite::database>("test.db"); // Inserción Person p("Alice", 30); db->persist(p); // Consulta using query = odb::query<Person>; auto result = db->query<Person>(query::age > 25); for (const auto& person : result) { std::cout << person.name() << ""; } return 0;}


2. SQLiteCpp — envoltorio ligero

SQLiteCpp es un envoltorio minimalista de C++ sobre la API C de SQLite. No es un ORM completo, pero proporciona una interfaz RAII conveniente para trabajar con consultas SQL.



Características clave:

  • Dependencia solo de SQLite3
  • API simple: Database, Statement, Transaction
  • Soporte para prepared statements y vinculación de parámetros


Ejemplo: inserción y consulta

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

int main() { SQLite::Database db("test.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE); // Creación de tabla db.exec("CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY, name TEXT, age INT)"); // Inserción con parámetros SQLite::Statement insert(db, "INSERT INTO person (name, age) VALUES (?, ?)"); insert.bind(1, "Bob"); insert.bind(2, 25); insert.exec(); // Consulta SQLite::Statement query(db, "SELECT name, age FROM person WHERE age > ?"); query.bind(1, 20); while (query.executeStep()) { std::cout << query.getColumn(0).getText() << " - " << query.getColumn(1).getInt() << ""; } return 0;}


3. Soci — acceso universal a BD

Soci es una biblioteca para trabajar con diversas bases de datos (MySQL, PostgreSQL, SQLite, Oracle) a través de una interfaz unificada. Proporciona tanto consultas dinámicas como soporte para mapeo similar a ORM.



Características clave:

  • Soporte para múltiples backends mediante plugins
  • Vinculación de parámetros mediante el operador << e into()
  • Soporte para transacciones y operaciones bulk


Ejemplo: trabajo con consultas


                
    
    

Recommendations