ORM للغة Go (Golang): مقارنة وأمثلة استخدام

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

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

ابدأ الدورة

ORM للغة Go (Golang): مقارنة وأمثلة



غالبًا ما يتطلب التطوير بلغة Go (Golang) التفاعل مع قواعد البيانات. بدلاً من كتابة استعلامات SQL الخام، يلجأ المطورون بشكل متزايد إلى ORM (Object-Relational Mapping) — وهي أدوات تعمل على أتمتة تحويل البيانات بين قاعدة البيانات العلائقية وكائنات اللغة. في هذه المقالة، سنستعرض أربع من أشهر مكتبات ORM للغة Go: GORM, Ent, SQLBoiler و Bun. ستتعرف على نقاط القوة والضعف لكل منها، وسترى أمثلة على الكود، وستتمكن من اتخاذ قرار واعٍ لمشروعك.



لماذا نحتاج ORM في Go؟

يحل ORM عدة مهام رئيسية:

  • تقليل الكود التكراري (boilerplate) — ليست هناك حاجة لكتابة عمليات CRUD يدويًا.
  • أمان الأنواع (Type Safety) — يتحقق مترجم Go من تطابق حقول الهيكل مع أعمدة الجدول.
  • ترحيلات المخطط (Schema Migrations) — إنشاء وتحديث الجداول تلقائيًا.
  • تجريد قاعدة البيانات — تغيير نظام إدارة قواعد البيانات (PostgreSQL, MySQL, SQLite) دون إعادة كتابة الاستعلامات.


1. GORM — الخيار الأكثر شيوعًا

GORM هو المعيار الفعلي لـ ORM في نظام Go البيئي. وهو معروف بوظائفه الغنية: الترحيلات التلقائية، الخطافات (hooks)، سلاسل الدوال (method chaining)، دعم المعاملات والعلاقات (Has Many, Belongs To, Many2Many).



مثال كود باستخدام GORM

package main

import ( "gorm.io/driver/sqlite" "gorm.io/gorm")

type User struct { gorm.Model Name string Email string `gorm:"uniqueIndex"`}

func main() { db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") }

// الترحيل التلقائي db.AutoMigrate(&User{})

// الإدراج db.Create(&User{Name: "Alice", Email: "alice@example.com"})

// القراءة var user User db.First(&user, 1) // بواسطة المفتاح الأساسي db.First(&user, "email = ?", "alice@example.com")

// التحديث db.Model(&user).Update("Name", "Bob")

// الحذف db.Delete(&user)}


الإيجابيات: مجتمع ضخم، وثائق وفيرة، دعم مدمج للعلاقات والخطافات.

السلبيات: أداء بطيء أحيانًا في الاستعلامات المعقدة، سلوك سحري (مثل التعديل التلقائي للحقول).



2. Ent — توليد الكود والكتابة الصارمة

Ent من Facebook (Meta) ليس مجرد ORM، بل هو إطار عمل كامل للتعامل مع الكيانات. يقوم بتوليد كود Go بناءً على مخطط موصوف بتركيب Go. وهذا يوفر أقصى أداء وأمان للأنواع.



مثال كود باستخدام Ent

// schema/user.gopackage schema

import ( "entgo.io/ent" "entgo.io/ent/schema/field")

type User struct { ent.Schema}

func (User) Fields() []ent.Field { return []ent.Field{ field.String("name"), field.String("email").Unique(), }}

// main.gopackage main

import ( "context" "log"

"entgo.io/ent/dialect/sqlite" "yourproject/ent")

func main() { client, err := ent.Open("sqlite3", "file:ent.db?cache=shared&mode=rwc") if err != nil { log.Fatal(err) } defer client.Close()

ctx := context.Background() // إنشاء الجداول if err := client.Schema.Create(ctx); err != nil { log.Fatal(err) }

// الإدراج u, _ := client.User.Create().SetName("Alice").SetEmail("alice@example.com").Save(ctx)

// القراءة user, _ := client.User.Get(ctx, u.ID) log.Println(user.Name)}


الإيجابيات: أداء عالٍ، كتابة كاملة (full typing)، دعم ممتاز لاستعلامات الرسم البياني (graph queries).

السلبيات: منحنى تعلم حاد، الحاجة إلى تشغيل توليد الكود، ميزات مدمجة أقل (مثل عدم وجود خطافات).



3. SQLBoiler —

توصيات