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

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

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

ابدأ الدورة

ORM لـ C++: مقارنة وأمثلة



في عالم C++، كان العمل مع قواعد البيانات تاريخيًا على مستوى منخفض أكثر منه في لغات مثل Python أو Java. ومع ذلك، تتطلب المشاريع الحديثة الراحة والإنتاجية، لذلك يلجأ المطورون بشكل متزايد إلى ORM (تعيين الكائنات العلائقية). يسمح ORM لـ C++ بالعمل مع الجداول ككائنات C++ عادية، وتوليد استعلامات SQL تلقائيًا، وإدارة ترحيلات المخطط. في هذه المقالة، سنستعرض خمس مكتبات شائعة: ODB، SQLiteCpp، SOCI، cppdb، وsqlpp11، ونقارن ميزاتها ونقدم أمثلة عملية.



1. ODB — المعيار المؤسسي



ODB هو إطار عمل ORM قوي لـ C++ يدعم العديد من أنظمة إدارة قواعد البيانات: MySQL، PostgreSQL، SQLite، Oracle، SQL Server. الميزة الرئيسية هي توليد الكود: تصف النموذج في ملف رأس مع تعليقات توضيحية، ويقوم مترجم ODB (odb) بإنشاء كود للعمل مع قاعدة البيانات.



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

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

const std::string& getName() const { return name_; } int getAge() const { return age_; }

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


بعد تشغيل odb -d mysql person.hxx يتم إنشاء ملفات التنفيذ. ثم نستخدم النمط القياسي:



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

int main() { auto db = std::make_shared<odb::mysql::database>("user", "pass", "mydb"); Person p("Alice", 30); db->persist(p); // تحميل auto loaded = db->load<Person>(1); return 0;}


الإيجابيات: ORM كامل، دعم الترحيلات، التحميل البطيء، العمل مع المعاملات. السلبيات: إعداد معقد، الحاجة لتوليد الكود، ثقل في المشاريع الصغيرة.



2. SQLiteCpp — الخفة والبساطة



SQLiteCpp هو غلاف حول SQLite3 بأسلوب RAII في C++. ليس ORM كاملاً، لكنه يوفر واجهة مريحة للعمل مع الاستعلامات.



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

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 * FROM person WHERE age > ?"); query.bind(1, 20); while (query.executeStep()) { std::cout << query.getColumn(1) << " " << query.getColumn(2) << ""; } return 0;}


الإيجابيات: بساطة، لا يتطلب توليد كود، يعمل فقط مع SQLite. السلبيات: لا يوجد تعيين كائنات، كتابة SQL يدويًا.



3. SOCI — المُجرّد العالمي



SOCI (مكتبة الوصول إلى قواعد البيانات C++) ليست ORM بالمعنى الدقيق، بل تجريد لأنظمة قواعد بيانات مختلفة (SQLite، PostgreSQL، MySQL، Oracle). توفر بناء جملة مريح لتنفيذ الاستعلامات وربط النتائج بهياكل C++.



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

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

int main() { soci::session sql(soci::sqlite3, "test.db"); sql << "CREATE TABLE person (id INTEGER PRIMARY KEY, name TEXT, age INT)"; Person p{1, "Charlie", 35}; sql << "INSERT INTO person (id, name, age) VALUES (:id, :name

توصيات