C++ وPostgreSQL: كيف تجمع بين البرمجة النظامية وقواعد البيانات العلائقية
\n\nهل تساءلت يومًا لماذا تختار العديد من الأنظمة عالية التحميل - من خوادم الألعاب إلى المنصات المالية - مزيج C++ وPostgreSQL؟ الإجابة بسيطة: يوفر C++ سرعة فائقة وتحكمًا في الذاكرة، بينما يوفر PostgreSQL الموثوقية وإمكانيات SQL القوية. هذا ليس مجرد "برنامج تعليمي آخر". إنه دليل عملي سيرشدك من تثبيت المشغل إلى كتابة تطبيق CRUD كامل بـ C++ مع PostgreSQL.
\n\nفي هذه المقالة ستتعلم:
\n- \n
- كيفية تثبيت وتهيئة libpq - عميل PostgreSQL الرسمي لـ C++. \n
- كيفية تنفيذ استعلامات SELECT وINSERT وUPDATE وDELETE. \n
- كيفية معالجة الأخطاء والعمل مع المعاملات. \n
- أمثلة على كود حقيقي يمكنك استخدامه فورًا في مشاريعك. \n
مستعد؟ هيا بنا!
\n\nالخطوة 1. تثبيت libpq وإعداد البيئة
\n\nقبل كتابة الكود، تحتاج إلى تثبيت مكتبة libpq. وهي جزء من العميل الخاص بـ PostgreSQL. إذا كان PostgreSQL مثبتًا لديك بالفعل، فإن libpq موجودة بالفعل. إذا لم يكن كذلك، فقم بتثبيتها بشكل منفصل.
\n\nلينكس (Ubuntu/Debian)
\nsudo apt update\nsudo apt install libpq-dev postgresql-server-dev-all\n\nmacOS (Homebrew)
\nbrew install postgresql\n\nويندوز
\nقم بتنزيل المثبت من الموقع الرسمي لـ PostgreSQL وأثناء التثبيت اختر المكون "Development Libraries".
\n\nبعد التثبيت، تحقق من أن المترجم g++ يمكنه العثور على المكتبة. للقيام بذلك، ستحتاج عند التجميع إلى تحديد الأعلام -lpq (الربط مع libpq) وربما -I/المسار/إلى/include.
الخطوة 2. الاتصال بقاعدة البيانات باستخدام C++
\n\nلنبدأ بالأهم - إنشاء الاتصال. لهذا، نستخدم الهيكل PGconn والدالة PQconnectdb().
مثال: اتصال بسيط
\n#include <iostream>\n#include <libpq-fe.h>\n\nint main() {\n // معلمات الاتصال\n const char* conninfo = "host=localhost port=5432 dbname=mydb user=myuser password=mypass";\n\n // إنشاء الاتصال\n PGconn* conn = PQconnectdb(conninfo);\n\n // التحقق من الحالة\n if (PQstatus(conn) != CONNECTION_OK) {\n std::cerr << "خطأ في الاتصال: " << PQerrorMessage(conn) << std::endl;\n PQfinish(conn);\n return 1;\n }\n\n std::cout << "تم الاتصال بـ PostgreSQL بنجاح!" << std::endl;\n\n // إغلاق الاتصال\n PQfinish(conn);\n return 0;\n}\n\nهام: لا تقم أبدًا بتضمين كلمات المرور في الكود. استخدم متغيرات البيئة أو ملفات التهيئة. المثال أعلاه للتوضيح فقط.
\n\nلنقم بتجميعه:
\ng++ -o connect connect.cpp -lpq\n\nالخطوة 3. تنفيذ استعلامات SQL: SELECT, INSERT, UPDATE, DELETE
\n\nالآن بعد إنشاء الاتصال، لنتعلم تنفيذ الاستعلامات. لهذا نستخدم الدالة PQexec() التي تُرجع النتيجة في شكل هيكل PGresult.
مثال: تنفيذ SELECT
\nPGresult* res = PQexec(conn, "SELECT id, name, age FROM users");\n\nif (PQresultStatus(res) != PGRES_TUPLES_OK) {\n std::cerr << "خطأ في الاستعلام: " << PQerrorMessage(conn) << std::endl;\n PQclear(res);\n PQfinish(conn);\n return 1;\n}\n\n// الحصول على عدد الصفوف والأعمدة\nint rows = PQntuples(res);\nint cols = PQnfields(res);\n\n// عرض عناوين الأعمدة\nfor (int i = 0; i < cols; ++i) {\n std::cout << PQfname(res, i) << "\\t";\n}\nstd::cout << std::endl;\n\n// عرض البيانات\nfor (int i = 0; i < rows; ++i) {\n for (int j = 0; j < cols; ++j) {\n std::cout << PQgetval