goose في Go: دليل شامل مع أمثلة
ما هي مكتبة goose ولماذا تحتاجها؟
مكتبة goose (Go Object-Oriented SQL Environment) هي أداة قوية لإدارة هجرات (تغييرات) قواعد البيانات في بيئة Go. على عكس الحلول المدمجة، تقدم goose نهجًا تصريحيًا لإدارة إصدارات هيكل قاعدة البيانات، مما يسمح للمطورين بوصف التغييرات باستخدام SQL أو كود Go. المهمة الأساسية لـ goose هي أتمتة عملية تطبيق وتراجع تغييرات هيكل قاعدة البيانات، وهو أمر بالغ الأهمية للعمل الجماعي وخطوط أنابيب CI/CD.
لماذا تحتاج إلى goose؟ أولاً، تحل مشكلة مزامنة هيكل قاعدة البيانات بين المطورين: يمكن لكل عضو في الفريق تطبيق أحدث الهجرات بأمر واحد. ثانيًا، تدعم goose إدارة الإصدارات — كل هجرة لها رقم فريد، مما يسمح بتحديد التغييرات التي تم تطبيقها بدقة. ثالثًا، تعمل المكتبة مع أنظمة قواعد بيانات مختلفة (PostgreSQL, MySQL, SQLite, ClickHouse وغيرها) من خلال واجهة موحدة، مما يبسط التبديل بين البيئات.
الميزة الرئيسية لـ goose مقارنة بالبدائل (مثل golang-migrate/migrate) هي دعم الهجرات المكتوبة بلغة Go، وليس SQL فقط. يمكنك كتابة هجرات معقدة تحتوي على منطق أعمال، واستخدام المعاملات (transactions)، والاتصال بواجهات برمجة تطبيقات خارجية. بالإضافة إلى ذلك، توفر goose دعمًا مدمجًا لـ embed (تضمين الهجرات داخل الملف التنفيذي)، وهو مثالي لبيئات الإنتاج.
طريقة التثبيت
يتم تثبيت goose عبر مدير الحزم القياسي للغة Go. تأكد أولاً من تثبيت Go إصدار 1.18 أو أحدث.
go install github.com/pressly/goose/v3/cmd/goose@latest
بعد التثبيت، تحقق من الإصدار:
goose --version
لاستخدام goose كمكتبة في مشروعك، أضف التبعية:
go get github.com/pressly/goose/v3
ستحتاج أيضًا إلى مشغل (driver) لنظام إدارة قواعد البيانات الخاص بك. على سبيل المثال، لـ PostgreSQL:
go get github.com/lib/pq
لـ MySQL:
go get github.com/go-sql-driver/mysql
لـ SQLite:
go get github.com/mattn/go-sqlite3
بداية سريعة — مثال عملي بسيط
لننشئ مشروعًا بسيطًا لتوضيح الإمكانيات الأساسية لـ goose.
1. أنشئ دليل المشروع وتهيئة الوحدة النمطية:
mkdir goose-demo && cd goose-demo
go mod init goose-demo
2. أنشئ دليلًا للهجرات:
mkdir migrations
3. أنشئ أول هجرة باستخدام SQL. الملف migrations/001_create_users.sql:
-- +goose Up
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- +goose Down
DROP TABLE users;
4. أنشئ ملف main.go لتشغيل الهجرات برمجيًا:
package main
import (
"database/sql"
"embed"
"log"
"github.com/pressly/goose/v3"
_ "github.com/lib/pq"
)
//go:embed migrations/*.sql
var migrations embed.FS
func main() {
// الاتصال بقاعدة البيانات
db, err := sql.Open("postgres", "host=localhost port=5432 user=postgres password=postgres dbname=testdb sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// تعيين مصدر الهجرات من embed.FS
goose.SetBaseFS(migrations)
// تنفيذ الهجرات حتى أحدث إصدار
if err := goose.Up(db, "migrations"); err != nil {
log.Fatal(err)
}
log.Println("تم تطبيق الهجرات بنجاح!")
}