مقدمة: لماذا يحتاج مطور C++ إلى قاعدة بيانات؟
C++ هي واحدة من أقوى لغات البرمجة، تُستخدم لبناء الأنظمة عالية التحميل، والألعاب، والتطبيقات المالية، والبرمجيات المضمنة. ومع ذلك، فإن أي تطبيق جاد يتطلب تخزين البيانات. وهنا تأتي أنظمة إدارة قواعد البيانات (DBMS) للإنقاذ.
في هذه المقالة، سنشرح كيفية الاتصال وتنفيذ العمليات الأساسية مع اثنين من أنظمة إدارة قواعد البيانات الشائعة — PostgreSQL العلائقية و MongoDB الموجهة للمستندات — باستخدام C++. المادة موجهة للمطورين المبتدئين الذين هم على دراية بأساسيات C++، لكنهم لم يعملوا بعد مع قواعد البيانات. ستتعلم كيفية تثبيت المكتبات اللازمة، وكتابة استعلامات CRUD بسيطة، وتجنب الأخطاء الشائعة.
1. إعداد البيئة واختيار المكتبات
قبل كتابة الكود، يجب تثبيت مكتبات العميل للعمل مع قواعد البيانات. بالنسبة لـ C++، هناك عدة خيارات، لكننا سننظر في الأكثر شيوعًا واستقرارًا:
- لـ PostgreSQL —
libpqxx(الغلاف الرسمي لـ C++ فوق libpq). - لـ MongoDB —
mongocxx(برنامج التشغيل الرسمي لـ C++ من MongoDB).
تثبيت libpqxx (Ubuntu/Debian)
sudo apt-get updatesudo apt-get install libpqxx-devبالنسبة لنظامي Windows أو macOS، استخدم مديري الحزم vcpkg أو Homebrew.
تثبيت mongocxx
أولاً، قم بتثبيت برنامج التشغيل الأساسي mongo-c-driver، ثم برنامج تشغيل C++:
# Ubuntusudo apt-get install libmongoc-dev libbson-devsudo apt-get install libmongocxx-devبعد التثبيت، تأكد من أن المترجم يرى ملفات الرأس. عند الترجمة، لا تنسَ تحديد علامات الربط:
g++ -std=c++17 main.cpp -lpqxx -lpq -lmongocxx -lbson2. العمل مع PostgreSQL في C++
PostgreSQL هو نظام إدارة قواعد بيانات كائني-علائقي قوي. سنستخدم مكتبة libpqxx التي توفر واجهة C++ مريحة.
الاتصال بالخادم وإنشاء جدول
أولاً، سنكتب برنامجًا بسيطًا يتصل بقاعدة بيانات محلية وينشئ جدول المستخدمين:
#include <iostream>#include <pqxx/pqxx>
int main() { try { // الاتصال بقاعدة البيانات "testdb" كمستخدم "postgres" pqxx::connection conn("host=localhost dbname=testdb user=postgres password=secret"); if (conn.is_open()) { std::cout << "تم الاتصال بـ PostgreSQL بنجاح!" << std::endl; }
// إنشاء معاملة pqxx::work txn(conn);
// استعلام SQL لإنشاء جدول txn.exec("CREATE TABLE IF NOT EXISTS users (" "id SERIAL PRIMARY KEY," "name VARCHAR(100) NOT NULL," "email VARCHAR(100) UNIQUE NOT NULL);");
txn.commit(); // تأكيد التغييرات std::cout << "تم إنشاء جدول users." << std::endl;
} catch (const std::exception &e) { std::cerr << "خطأ: " << e.what() << std::endl; } return 0;}عمليات CRUD: إدراج وقراءة البيانات
سنضيف بعض السجلات ونجري استعلامًا:
pqxx::work txn(conn);
// إدراج البياناتtxn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);", "إيفان بيتروف", "ivan@example.com");txn.exec_params("INSERT INTO users (name, email) VALUES ($1, $2);", "ماريا سميرنوفا", "maria@example.com");txn.commit();
// قراءة البياناتpqxx::nontransaction ntxn(conn);pqxx::result result = ntxn.exec("SELECT id, name, email FROM users;");
for (auto row : result) { std::cout << "ID: " << row[0].as<int>() << ", الاسم: " << row[1].as<std::string>() << ", البريد الإلكتروني: " << row[2].as<std::string>() << std::endl;}