ORM للغة Go (Golang): مقارنة وأمثلة للمكتبات الشائعة

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

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

ابدأ الدورة

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



تشتهر لغة Go (Golang) بأدائها العالي وبساطتها، لكن العمل مع قواعد البيانات غالباً ما يتطلب كتابة كمية كبيرة من كود SQL النمطي. تهدف مكتبات ORM (تعيين الكائنات العلائقية) إلى تبسيط التفاعل مع قاعدة البيانات من خلال أتمتة تعيين هياكل Go إلى جداول. في هذه المقالة، سنستعرض ثلاثة من أشهر ORMs للغة Go: GORM و Ent و SQLBoiler، وسنقارنها وفقاً للمعايير الرئيسية ونقدم أمثلة عملية.



1. GORM — أشهر ORM للغة Go



GORM هي ORM كاملة الميزات مع مجتمع نشط وعدد هائل من الإمكانيات: الترحيلات، الخطافات (hooks)، التحميل المسبق للعلاقات، المعاملات (transactions) وغيرها الكثير. تعمل وفق مبدأ "الاتفاقية قبل التكوين" وتدعم معظم أنظمة إدارة قواعد البيانات الشائعة (PostgreSQL, MySQL, SQLite).



المزايا:

  • بداية سريعة: الحد الأدنى من الإعدادات، إنشاء تلقائي للجداول.
  • نظام بيئي غني: إضافات، مسجلات، أدوات تحقق.
  • دعم الارتباطات (Belongs To, Has Many, Many2Many).


العيوب:

  • أداء متوسط بسبب الانعكاس (reflection) وتوليد SQL أثناء التشغيل.
  • صعوبات في تحسين الاستعلامات المعقدة (مشكلة N+1).


مثال على استخدام GORM:

package main

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

type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"size:100"` Age int}

func main() { // الاتصال بـ SQLite 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: "إيفان", Age: 30})

// قراءة var user User db.First(&user, 1) // البحث بواسطة المعرف db.First(&user, "name = ?", "إيفان") // البحث حسب الشرط

// تحديث db.Model(&user).Update("Age", 31)

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


2. Ent — ORM من فيسبوك مع توليد الكود



Ent هي ORM حديثة تقوم بتوليد كود Go مقيد النوع (typed) بناءً على مخطط البيانات الموصوف في هياكل Go. تقدم كتابة صارمة (strict typing)، وأداء ممتاز، وواجهة برمجة تطبيقات رسومية (graph API) قوية للاستعلامات. يتم تطوير Ent بنشاط ويستخدم في المشاريع الكبيرة (على سبيل المثال، في فيسبوك نفسه).



المزايا:

  • توليد الكود: أخطاء في مرحلة الترجمة، وليس في وقت التشغيل.
  • أداء عالٍ بفضل SQL الثابت (static SQL).
  • واجهة برمجة تطبيقات مريحة لبناء استعلامات معقدة مع التصفية والترتيب.


العيوب:

  • الحاجة إلى تثبيت أداة CLI وتوليد الكود.
  • منحنى تعلم أكثر حدة مقارنة بـ GORM.


مثال على استخدام Ent:

package main

import ( "context" "log"

"entgo.io/ent/dialect/sqlite" "github.com/yourproject/ent" "github.com/yourproject/ent/user")

func main() { // الاتصال بـ SQLite client, err := ent.Open("sqlite3", "file:ent.db?cache=shared&_fk=1") if err != nil { log.Fatalf("failed opening connection to sqlite: %v", err) } defer client.Close()

// الترحيل التلقائي if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) }

// إنشاء مستخدم createdUser, err := client.User.Create(). SetName("بيتر"). SetAge(25). Save(context.Background()) if err != nil { log.Fatalf("failed creating user: %v", err) }

// استعلام مع تصفية users, err := client.User.Q

توصيات