ORM لـ C++: مقارنة وأمثلة استخدام (ODB, SOCI, SQLiteCpp)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ORM لـ C++: مقارنة وأمثلة استخدام



على عكس اللغات ذات الكتابة الديناميكية (Python, PHP)، لا تحتوي C++ على دعم مدمج للانعكاس والبرمجة الفوقية كافٍ لإنشاء ORM "سحري". ومع ذلك، هناك العديد من الحلول القوية التي تؤتمت العمل مع قواعد البيانات. في هذه المقالة، سنقارن ثلاث مكتبات شائعة: ODB و SOCI و SQLiteCpp، وسنقدم أمثلة على استخدامها.



معايير المقارنة

عند اختيار ORM لـ C++، يجدر الانتباه إلى:

  • نوع توليد الكود — مولد خارجي أو قوالب C++.
  • دعم أنظمة إدارة قواعد البيانات — SQLite, PostgreSQL, MySQL, Oracle.
  • الأداء — النفقات العامة للتخطيط.
  • صعوبة التكامل — هل يتطلب خطوة بناء منفصلة.


1. ODB — ORM صناعي لـ C++

ODB هو ORM تجاري (مع نسخة مجانية للمشاريع مفتوحة المصدر)، يعتمد على توليد الكود من ملفات الرأس المشروحة. يدعم قواعد البيانات العلائقية (SQLite, PostgreSQL, MySQL, Oracle) وحتى NoSQL (MongoDB).



مثال مع ODB (SQLite)

أولاً، نعلن عن فئة الكيان:

#include <odb/core.hxx>

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

unsigned long id() const { return id_; } 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_;};


الاستخدام:

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

int main() { auto db = std::make_shared<odb::sqlite::database>("test.db"); odb::transaction t(db->begin());

Person p("Alice", 30); db->persist(p); // INSERT

auto result = db->query<Person>( odb::query<Person>::age > 25); for (const auto& person : result) { std::cout << person.name() << std::endl; } t.commit();}


الإيجابيات: نموذج كائن كامل، دعم العلاقات، التحميل البطيء. السلبيات: يحتاج إلى مولد كود (خطوة بناء)، ترخيص تجاري.



2. SOCI — "طبقة الوصول إلى البيانات" خفيفة الوزن

SOCI ليس ORM كاملاً، بل مكتبة للعمل مع SQL من C++، توفر بناء جملة مناسب لتنفيذ الاستعلامات وتخطيط النتائج. تعمل مع SQLite, PostgreSQL, MySQL, Oracle و ODBC.



مثال مع SOCI

#include <soci/soci.h>#include <soci/sqlite3/soci-sqlite3.h>#include <iostream>

struct Person { int id; std::string name; int age;};

int main() { soci::session sql(soci::sqlite3, "test.db"); sql << "CREATE TABLE IF NOT EXISTS person (" "id INTEGER PRIMARY KEY, " "name TEXT, age INTEGER)";

// إدراج sql << "INSERT INTO person (name, age) VALUES (:name, :age)", soci::use("Bob"), soci::use(25);

// استعلام مع تخطيط إلى هيكل Person p; soci::indicator ind; sql << "SELECT id, name, age FROM person WHERE id = :id", soci::use(1), soci::into(p.id), soci::into(p.name, ind), soci::into(p.age);

if (ind == soci::i_ok) { std::cout << p.name << " " << p.age << std::endl; }}


الإيجابيات: تكامل سهل، لا توليد كود، دعم العبارات المحضرة. السلبيات: لا تخطيط تلقائي للكا

توصيات