ترحيلات قواعد البيانات في Go: نظرة عامة على الأدوات والممارسات

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

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

ابدأ الدورة

ترحيلات قواعد البيانات في 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 1


2. مكتبة 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


مثال على ترحيل SQL

توصيات