ent في Go: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

ما هي مكتبة ent ولماذا تحتاجها؟

ent هي مكتبة ORM (تعيين الكائنات العلائقية) قوية للغة Go، تعتمد على نهج توليد الكود. على عكس ORM التقليدية حيث تكتب الهياكل والتعليقات يدويًا، تقوم ent بتوليد الكود بالكامل بناءً على مخطط البيانات الخاص بك المكتوب بلغة Go.

المزايا الرئيسية لـ ent:

  • أمان الأنواع: يتم التحقق من جميع الاستعلامات في مرحلة التجميع، مما يمنع أخطاء وقت التشغيل الناتجة عن أسماء الحقول أو الأنواع غير الصحيحة.
  • توليد الكود: تصف المخطط مرة واحدة، وتقوم ent بتوليد جميع الهياكل اللازمة، ومنشئي الاستعلامات، والترحيلات، وحتى الاختبارات.
  • الأداء العالي: الكود المُولَّد مُحسَّن ولا يستخدم الانعكاس (Reflection)، مما يجعله أسرع من العديد من ORM الأخرى.
  • استعلامات الرسم البياني: تتيح ent بسهولة تنفيذ استعلامات تحميل الكيانات المرتبطة (Eager Loading) وبناء استعلامات رسم بياني معقدة.
  • دعم قواعد بيانات متعددة: MySQL، PostgreSQL، SQLite، Gremlin (لقواعد بيانات الرسم البياني) وغيرها.

تعتبر ent مثالية للمشاريع التي تتطلب الموثوقية والأداء العالي والكتابة الصارمة للأنواع. تُستخدم بشكل متكرر في بنية الخدمات المصغرة والأنظمة عالية التحميل والمشاريع التي تحتاج إلى هيكل بيانات واضح.

التثبيت

يتضمن تثبيت ent مكونين: الحزمة نفسها وأداة CLI لتوليد الكود.

# تثبيت أداة CLI (مرة واحدة)
go install entgo.io/ent/cmd/ent@latest

# تهيئة المشروع (إنشاء مجلد ent والمخطط)
ent init User

# تثبيت التبعيات
go mod tidy

بعد تنفيذ هذه الأوامر، سيظهر لديك مجلد ent/ مع ملف schema/user.go حيث ستقوم بوصف مخطط البيانات.

بداية سريعة مع مثال كود

لنقم بإنشاء نموذج مستخدم بسيط ونتعلم كيفية تنفيذ العمليات الأساسية.

1. وصف المخطط (ent/schema/user.go)

package schema

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

// User يحمل تعريف مخطط كيان المستخدم.
type User struct {
    ent.Schema
}

// حقول المستخدم.
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name").
            NotEmpty().
            Unique(),
        field.Int("age").
            Positive(),
        field.String("email").
            Unique(),
    }
}

2. توليد الكود

go generate ./ent

سينشئ هذا الأمر جميع الملفات اللازمة: العميل، منشئي الاستعلامات، الترحيلات، إلخ.

3. الاستخدام في main.go

package main

import (
    "context"
    "fmt"
    "log"

    "your-project/ent"
    "your-project/ent/user"
    _ "github.com/mattn/go-sqlite3"
)

func main() {
    // إنشاء عميل لـ SQLite (في الذاكرة)
    client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")
    if err != nil {
        log.Fatalf("فشل فتح الاتصال بـ sqlite: %v", err)
    }
    defer client.Close()

    // الترحيل التلقائي
    ctx := context.Background()
    if err := client.Schema.Create(ctx); err != nil {
        log.Fatalf("فشل إنشاء موارد المخطط: %v", err)
    }

    // إنشاء مستخدم
    newUser, err := client.User.
        Create().
        SetName("أحمد").
        SetAge(30).
        SetEmail("ahmed@example.com").
        Save(ctx)
    if err != nil {
        log.Fatalf("فشل إنشاء المستخدم: %v", err)
    }
    fmt.Println("تم إنشاء المستخدم:", newUser.ID)

    // الاستعلام عن مستخدم بالاسم
    foundUser, err := client.User.
        Query().
        Where(user.Name("أحمد")).
        Only(ctx)
    if err != nil {
        log.Fatalf("فشل الاستعلام عن المستخدم: %v", err)
    }
    fmt.Printf("تم العثور على المستخدم: %+v\n", foundUser)
}

الأساليب والوظائف الأساسية

1. Create() — إنشاء سجل

<

توصيات