ترحيل قواعد البيانات في C++: نظرة عامة على الأدوات والمكتبات

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

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

ابدأ الدورة

ترحيل قواعد البيانات في C++: إدارة المخطط وإصداره

في مشاريع C++ الحديثة التي تعمل مع قواعد البيانات العلائقية (PostgreSQL، MySQL، SQLite)، يُعد دعم تطور المخطط ممارسة إلزامية. تسمح الترحيلات بتطبيق تغييرات هيكل الجداول والفهارس والقيود تلقائيًا، مع الحفاظ على سلامة البيانات بين إصدارات التطبيق. على عكس اللغات الديناميكية، لا تحتوي C++ على أداة مدمجة للترحيلات، ولكن هناك العديد من المكتبات الناضجة التي تحل هذه المشكلة.



المتطلبات الأساسية لمكتبة الترحيلات لـ C++

  • إصدار التغييرات: يجب أن يكون لكل ترحيل معرف فريد (رقمي أو طابع زمني).
  • دعم الاسترجاع: إمكانية تطبيق عمليات "up" (إنشاء/تعديل) و"down" (حذف/استرجاع).
  • التكامل مع نظام إدارة قواعد البيانات: العمل عبر برامج التشغيل القياسية (libpq، sqlite3، MySQL Connector).
  • المعاملات: يتم تنفيذ كل ترحيل في معاملة منفصلة لضمان الذرية.
  • التطبيق التلقائي: أداة سطر أوامر أو API للتشغيل عند بدء التطبيق.


الأدوات الشائعة للترحيلات في C++

1. cpp-migrations (موصى به)

مكتبة خفيفة الوزن مفتوحة المصدر، تدعم PostgreSQL، MySQL، SQLite. يتم وصف الترحيلات على شكل فئات C++ مع طرق up() و down(). يتم تثبيت الإصدار في ملف migrations.json.

// مثال على ترحيل لـ cpp-migrations#include <migration.hpp>

class CreateUsersTable : public Migration {public: void up() override { execute("CREATE TABLE users (" "id SERIAL PRIMARY KEY," "name VARCHAR(100) NOT NULL," "email VARCHAR(255) UNIQUE," "created_at TIMESTAMP DEFAULT NOW()" ")"); }

void down() override { execute("DROP TABLE IF EXISTS users"); }};

REGISTER_MIGRATION(CreateUsersTable, "001_create_users");

تشغيل الترحيلات عبر API:

#include <migration_runner.hpp>

int main() { MigrationRunner runner("postgresql://user:pass@localhost/db"); runner.applyPending(); // يطبق جميع الترحيلات غير المطبقة return 0;}


2. الترحيلات القائمة على libpq (نهج مخصص)

إذا كان المشروع يستخدم بالفعل libpq (العميل الأصلي لـ PostgreSQL)، يمكن تنفيذ مدير ترحيلات بسيط يعتمد على ملفات SQL. مثال على الهيكل:

migrations/├── 001_create_users.sql├── 001_create_users.down.sql├── 002_add_role_column.sql└── 002_add_role_column.down.sql

كود المُحمّل في C++:

#include <pqxx/pqxx>#include <filesystem>#include <fstream>

void applyMigrations(pqxx::connection &conn) { pqxx::work txn(conn); // إنشاء جدول لتتبع الترحيلات المطبقة txn.exec("CREATE TABLE IF NOT EXISTS _migrations (" "id SERIAL PRIMARY KEY," "name TEXT UNIQUE," "applied_at TIMESTAMP DEFAULT NOW())"); for (const auto &entry : std::filesystem::directory_iterator("migrations")) { std::string filename = entry.path().filename().string(); if (filename.find(".down.") != std::string::npos) continue; if (filename.find(".sql") == std::string::npos) continue; // التحقق مما إذا كان الترحيل قد طُبق auto check = txn.exec_params("SELECT 1 FROM _migrations WHERE name = $1", filename); if (check.empty()) { std::ifstream file(entry.path()); std::string sql((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); txn.exec(sql); txn.exec_params("INSERT INTO _migrations (name) VALU

توصيات