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
También en la biblioteca
Cliente HTTP para Rust: mejores bibliotecas y herramientas
Pruebas en JavaScript (Node.js): frameworks y herramientas
Envío de SMS en C++: API con biblioteca LibCurl y solicitudes REST
Trabajo con imágenes en TypeScript: bibliotecas y herramientas
Trabajo con archivos ZIP en Kotlin: creación, lectura y descompresión
Recommendations