ترحيلات قواعد البيانات في Go (Golang): دليل شامل للأدوات

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

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

ابدأ الدورة

ترحيلات قواعد البيانات في Go (Golang): كيفية إدارة مخطط البيانات

\n\n

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

\n\n

في نظام Go البيئي، توجد عدة مكتبات ناضجة لإدارة الترحيلات. في هذه المقالة، سنقوم بتحليل ثلاثة من أشهر الأدوات بالتفصيل: golang-migrate/migrate و pressly/goose و rubenv/sql-migrate. ستتعلم كيفية تثبيت وتكوين واستخدام كل منها، بالإضافة إلى التعرف على أفضل الممارسات.

\n\n

ما هي الترحيلات ولماذا هي مطلوبة؟

\n\n

الترحيل هو ملف (أو مجموعة ملفات) يحتوي على أوامر SQL لتغيير مخطط قاعدة البيانات. كل ترحيل له معرف فريد (عادةً طابع زمني أو رقم) واتجاهان: up (تطبيق التغييرات) و down (التراجع عن التغييرات).

\n\n

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

\n
    \n
  • إصدار المخطط — يتم تخزين سجل التغييرات في المستودع مع الكود.
  • \n
  • قابلية التكرار — نفس التغييرات في جميع البيئات.
  • \n
  • التراجع عن التغييرات — إمكانية العودة بسرعة إلى الإصدار السابق من المخطط.
  • \n
  • العمل الجماعي — لا يقوم المطورون بالكتابة فوق تغييرات بعضهم البعض.
  • \n
\n\n

1. golang-migrate/migrate

\n\n

المكتبة الأكثر شيوعًا للترحيلات في Go. تدعم PostgreSQL و MySQL و SQLite و MongoDB والعديد من قواعد البيانات الأخرى.

\n\n

التثبيت

\n
go get -u github.com/golang-migrate/migrate/v4\ngo install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
\n\n

هيكل الترحيلات

\n

أنشئ مجلدًا باسم migrations وأضف ملفات ببادئة بالتنسيق {timestamp}_{title}.{direction}.sql:

\n
migrations/\n  000001_create_users_table.up.sql\n  000001_create_users_table.down.sql\n  000002_add_email_column.up.sql\n  000002_add_email_column.down.sql
\n\n

مثال على الترحيل (up)

\n
-- 000001_create_users_table.up.sql\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(100) NOT NULL,\n    created_at TIMESTAMP DEFAULT NOW()\n);
\n\n

مثال على الترحيل (down)

\n
-- 000001_create_users_table.down.sql\nDROP TABLE IF EXISTS users;
\n\n

تطبيق الترحيلات من كود Go

\n
package main\n\nimport (\n    "github.com/golang-migrate/migrate/v4"\n    _ "github.com/golang-migrate/migrate/v4/database/postgres"\n    _ "github.com/golang-migrate/migrate/v4/source/file"\n)\n\nfunc main() {\n    m, err := migrate.New(\n        "file://migrations",\n        "postgres://localhost:5432/mydb?sslmode=disable")\n    if err != nil {\n        panic(err)\n    }\n    if err := m.Up(); err != nil && err != migrate.ErrNoChange {\n        panic(err)\n    }\n}
\n\n

2. pressly/goose

\n\n

Goose — أداة خفيفة وسريعة تدعم أيضًا كتابة الترحيلات بلغة Go (وليس فقط SQL). مثالية للمشاريع التي تتطلب منطقًا على جانب الكود.

\n\n

التثبيت

\n
go get github.com/pressly/goose/v3/cmd/goose
\n\n

إنشاء ترحيل

\n
goose create create_users_table sql
\n\n

سيتم إنشاء ملف بالشكل 20250101120000_create_users_table.sql. المحتوى:

\n
-- +goose Up\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(100) NOT NULL\n);\n\n-- +goose Down\nDROP TABLE IF EXISTS users;
\n\n

ترحيلات Go (خيار متقدم)

\n

يتيح Goose كتابة الترحيلات

توصيات