ORM لـ C++: مقارنة وأمثلة استخدام
في التطوير الحديث بلغة C++، غالبًا ما يتطلب العمل مع قواعد البيانات توازنًا بين الأداء وسهولة الاستخدام. على عكس اللغات ذات النظام البيئي الغني لـ ORM (مثل Python أو Java)، تقدم C++ مجموعة أدوات أضيق ولكنها ناضجة. في هذه المقالة، سنقارن أربع مكتبات شائعة: ODB وSQLiteCpp وSoci وsqlpp11. سننظر في بنيتها، وبناء جملتها، وأدائها، وأمثلة الكود.
1. ODB — المعيار الصناعي
ODB هو مترجم ORM كامل للغة C++. يقوم بإنشاء كود من ملفات الرأس، ويدعم قواعد البيانات العلائقية (MySQL, PostgreSQL, SQLite, Oracle) ويوفر تعيينًا قويًا بين الكائنات والعلاقات.
الميزات الرئيسية:
- توليد تلقائي للكود عبر المترجم المسبق (odb)
- دعم الوراثة، تعدد الأشكال، حاويات STL
- تحميل كسول، تخزين مؤقت، معاملات
مثال: النموذج والاستعلام
// 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"); // إدراج Person p("Alice", 30); db->persist(p); // استعلام 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 — غلاف خفيف
SQLiteCpp هو غلاف C++ بسيط فوق واجهة SQLite C API. إنه ليس ORM كاملاً، لكنه يوفر واجهة RAII مريحة للعمل مع استعلامات SQL.
الميزات الرئيسية:
- الاعتماد فقط على SQLite3
- API بسيط: Database, Statement, Transaction
- دعم العبارات المعدة وربط المعاملات
مثال: إدراج واستعلام
#include <SQLiteCpp/Database.h>#include <iostream>
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(); // استعلام 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 — وصول عالمي لقواعد البيانات
Soci هي مكتبة للعمل مع قواعد بيانات مختلفة (MySQL, PostgreSQL, SQLite, Oracle) من خلال واجهة موحدة. توفر استعلامات ديناميكية ودعمًا للتعيين الشبيه بـ ORM.
الميزات الرئيسية:
- دعم عدة خلفيات من خلال الإضافات
- ربط المعاملات عبر عامل التشغيل << و into()
- دعم المعاملات والعمليات المجمعة
مثال: العمل مع الاستعلامات
أيضاً في المكتبة
توصيات