migrate في Go: دليل شامل مع أمثلة تطبيقية

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

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

ابدأ الدورة

migrate في Go: دليل شامل مع أمثلة تطبيقية

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

ما هي مكتبة migrate ولماذا تحتاجها؟

أثناء تطوير أي تطبيق يتعامل مع قاعدة بيانات، ستواجه حتمًا الحاجة لتعديل هيكل الجداول: إضافة عمود جديد، إنشاء فهرس (index)، تغيير نوع البيانات، أو إعادة تسمية جدول. إذا كنت تعمل ضمن فريق أو تنشر التطبيق على عدة بيئات (تطوير، اختبار، إنتاج)، فإن تنفيذ استعلامات SQL يدويًا يصبح مصدرًا للأخطاء وعدم الاتساق.

تحل مكتبة migrate هذه المشكلة من خلال توفير طريقة بسيطة وتصريحية لوصف تغييرات الهيكل. كل ترحيل (migration) هو عبارة عن ملفين: الأول لتطبيق التغييرات (up)، والثاني للتراجع عنها (down). تتتبع المكتبة أي الترحيلات تم تطبيقها بالفعل، وتسمح لك بالتحرك بأمان للأمام أو للخلف عبر تاريخ التغييرات.

المزايا الرئيسية لاستخدام migrate:

  • إدارة الإصدارات: كل ترحيل له رقم فريد أو طابع زمني، مما يسمح بمعرفة إصدار الهيكل المستخدم بدقة.
  • قابلية إعادة الإنتاج: يمكنك بناء قاعدة البيانات من الصفر عن طريق تطبيق جميع الترحيلات بالتسلسل.
  • الأمان: وجود ترحيلات للتراجع (down) يسمح بالعودة عن التغييرات في حال حدوث خطأ.
  • الاستقلالية عن لغة البرمجة: تُكتب الترحيلات بلغة SQL النقية، مما يجعلها قابلة للنقل بين مشاريع بلغات مختلفة.

التثبيت

لتثبيت مكتبة migrate في Go، استخدم الأمر القياسي go get. يُوصى بتثبيتها كاعتماد (dependency) لمشروعك:

go get -u github.com/golang-migrate/migrate/v4

ستحتاج أيضًا إلى تثبيت مشغل (driver) لقاعدة البيانات الخاصة بك. على سبيل المثال، لـ PostgreSQL:

go get -u github.com/golang-migrate/migrate/v4/database/postgres

لـ MySQL:

go get -u github.com/golang-migrate/migrate/v4/database/mysql

لـ SQLite:

go get -u github.com/golang-migrate/migrate/v4/database/sqlite3

بالإضافة إلى ذلك، ستحتاج إلى مشغل لمصدر الترحيلات. الأكثر استخدامًا هو نظام الملفات:

go get -u github.com/golang-migrate/migrate/v4/source/file

كما تتوفر مشغلات لـ io/fs و github و gitlab و s3 ومصادر أخرى.

بداية سريعة — مثال عملي بسيط

لننشئ تطبيقًا بسيطًا يتصل بقاعدة بيانات SQLite ويطبق الترحيلات.

أولاً، أنشئ هيكل المجلدات للترحيلات:

mkdir -p migrations
cd migrations

أنشئ أول ترحيل. يجب أن يتطابق اسم الملف مع النمط: {الإصدار}_{الاسم}.{الاتجاه}.sql. الإصدار عادة ما يكون طابعًا زمنيًا أو رقمًا تسلسليًا.

الملف: migrations/000001_create_users_table.up.sql

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    email TEXT NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

الملف: migrations/000001_create_users_table.down.sql

DROP TABLE IF EXISTS users;

توصيات