ترحيلات قواعد البيانات في Go (Golang): دليل شامل
عند تطوير تطبيقات الويب بلغة Go، عاجلاً أم آجلاً تنشأ الحاجة لتغيير هيكل قاعدة البيانات: إضافة جداول جديدة، تعديل الأعمدة الموجودة أو إنشاء فهارس. يؤدي تنفيذ نصوص SQL يدويًا في بيئات مختلفة (التطوير، الاختبار، الإنتاج) إلى أخطاء وعدم تزامن. حل هذه المشكلة هو ترحيلات قواعد البيانات.
في Go، توجد عدة مكتبات ناضجة لإدارة الترحيلات. في هذه المقالة، سنشرح بالتفصيل المكتبتين الأكثر شيوعًا: golang-migrate/migrate و pressly/goose، وسنقدم أمثلة على استخدامهما.
ما هي الترحيلات ولماذا نحتاجها؟
الترحيل هو مجموعة مُرقمة من أوامر SQL (أو كود Go) يتم تطبيقها على قاعدة البيانات بشكل تسلسلي. كل ترحيل له معرف فريد (عادةً طابع زمني أو رقم) ويمكن تطبيقه (up) أو التراجع عنه (down).
المزايا الرئيسية:
- أتمتة تغييرات مخطط قاعدة البيانات
- قابلية التكرار - نفس النتيجة في أي بيئة
- إمكانية التراجع عن التغييرات
- تخزين سجل التغييرات في الكود (متوافق مع أنظمة التحكم بالإصدارات)
1. مكتبة golang-migrate/migrate
هذه هي المكتبة الأكثر شيوعًا للترحيلات في Go. تدعم PostgreSQL، MySQL، SQLite، MongoDB وأنظمة إدارة قواعد بيانات أخرى. يمكن كتابة الترحيلات إما بلغة SQL الخالصة أو بلغة Go.
التثبيت
go get -u github.com/golang-migrate/migrate/v4هيكل ملفات الترحيلات
توجد الملفات في مجلد migrations/ وتُسمى وفق النمط:
{timestamp}_{title}.up.sql{timestamp}_{title}.down.sqlمثال:
migrations/ 000001_create_users_table.up.sql 000001_create_users_table.down.sql 000002_add_email_to_users.up.sql 000002_add_email_to_users.down.sqlمثال على ترحيل SQL
ملف 000001_create_users_table.up.sql:
CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT NOW());ملف 000001_create_users_table.down.sql:
DROP TABLE IF EXISTS users;تطبيق الترحيلات من كود Go
package main
import ( "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file")
func main() { m, err := migrate.New( "file://migrations", "postgres://user:password@localhost:5432/dbname?sslmode=disable", ) if err != nil { panic(err) }
// تطبيق جميع الترحيلات المتاحة (Up) if err := m.Up(); err != nil && err != migrate.ErrNoChange { panic(err) }
// التراجع عن آخر ترحيل (Down) // if err := m.Steps(-1); err != nil { // panic(err) // }}أداة سطر الأوامر migrate CLI
كما تتوفر أداة سطر الأوامر:
migrate create -ext sql -dir migrations -seq create_users_tablemigrate -path migrations -database "postgres://..." upmigrate -path migrations -database "postgres://..." down 12. مكتبة pressly/goose
Goose هي أداة شائعة أخرى، تم إنشاؤها في الأصل كبديل لترحيلات ActiveRecord من Ruby on Rails. تدعم ترحيلات SQL و Go، بالإضافة إلى CLI مدمج.
التثبيت
go get -u github.com/pressly/goose/v3هيكل الملفات
تُسمى الملفات كـ {timestamp}_{title}.sql (بدون تقسيم إلى up/down - كل شيء في ملف واحد عبر التعليقات):
migrations/ 20240101120000_create_users_table.sql 20240102150000_add_email_to_users.sql