ترحيلات قواعد البيانات في Go (Golang): كيفية إدارة مخطط البيانات
\n\nعند تطوير التطبيقات بلغة Go، عاجلاً أم آجلاً تنشأ الحاجة لتغيير هيكل قاعدة البيانات: إضافة جداول جديدة، تعديل الأعمدة الموجودة، إنشاء فهارس. يؤدي تنفيذ نصوص SQL يدويًا في بيئات مختلفة (بيئة التطوير المحلية، بيئة الاختبار، الإنتاج) إلى حدوث أخطاء وعدم تزامن. الحل هو ترحيلات قواعد البيانات (database migrations).
\n\nفي نظام Go البيئي، توجد عدة مكتبات ناضجة لإدارة الترحيلات. في هذه المقالة، سنقوم بتحليل ثلاثة من أشهر الأدوات بالتفصيل: golang-migrate/migrate و pressly/goose و rubenv/sql-migrate. ستتعلم كيفية تثبيت وتكوين واستخدام كل منها، بالإضافة إلى التعرف على أفضل الممارسات.
ما هي الترحيلات ولماذا هي مطلوبة؟
\n\nالترحيل هو ملف (أو مجموعة ملفات) يحتوي على أوامر SQL لتغيير مخطط قاعدة البيانات. كل ترحيل له معرف فريد (عادةً طابع زمني أو رقم) واتجاهان: up (تطبيق التغييرات) و down (التراجع عن التغييرات).
\n\nالمزايا الرئيسية لاستخدام الترحيلات:
\n- \n
- إصدار المخطط — يتم تخزين سجل التغييرات في المستودع مع الكود. \n
- قابلية التكرار — نفس التغييرات في جميع البيئات. \n
- التراجع عن التغييرات — إمكانية العودة بسرعة إلى الإصدار السابق من المخطط. \n
- العمل الجماعي — لا يقوم المطورون بالكتابة فوق تغييرات بعضهم البعض. \n
1. golang-migrate/migrate
\n\nالمكتبة الأكثر شيوعًا للترحيلات في Go. تدعم PostgreSQL و MySQL و SQLite و MongoDB والعديد من قواعد البيانات الأخرى.
\n\nالتثبيت
\ngo 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:
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
\npackage 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\n2. pressly/goose
\n\nGoose — أداة خفيفة وسريعة تدعم أيضًا كتابة الترحيلات بلغة Go (وليس فقط SQL). مثالية للمشاريع التي تتطلب منطقًا على جانب الكود.
\n\nالتثبيت
\ngo get github.com/pressly/goose/v3/cmd/goose\n\nإنشاء ترحيل
\ngoose create create_users_table sql\n\nسيتم إنشاء ملف بالشكل 20250101120000_create_users_table.sql. المحتوى:
-- +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 كتابة الترحيلات