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

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

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

ابدأ الدورة

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()
  • دعم المعاملات والعمليات المجمعة


مثال: العمل مع الاستعلامات


                
    
    

توصيات