GraphQL في Go: دليل كامل لمكتبة gqlgen

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

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

ابدأ الدورة

مكتبة gqlgen للغة Go (Golang): إنشاء واجهة برمجة تطبيقات GraphQL



أصبح GraphQL المعيار الفعلي لبناء واجهات برمجة التطبيقات الحديثة بفضل مرونته وكفاءته. في بيئة Go (Golang)، واحدة من أقوى وأشهر المكتبات للعمل مع GraphQL هي gqlgen. توفر للمطورين طريقة سهلة لتحديد المخططات، وتوليدًا تلقائيًا للكود النمطي، وأداءً عاليًا.



ما هي gqlgen ولماذا يجب اختيارها؟



gqlgen (اختصار لـ "graphql generator") هي مكتبة للغة Go تقوم ببناء خادم GraphQL بناءً على المخطط. ميزتها الرئيسية هي نهج الكود أولاً: تقوم بوصف المخطط في ملف .graphql، وتقوم المكتبة بتوليد كل كود Go الضروري (الهياكل، الواجهات للمحللات). هذا يخلصك من كتابة الكود النمطي الروتيني ويقلل من احتمالية الأخطاء.



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

  • توليد تلقائي للكود: يتم إنشاء الأنواع والطرق وواجهات المحللات من المخطط.
  • أمان الأنواع: يتم التحقق من جميع الأنواع في مرحلة الترجمة بلغة Go.
  • الأداء: المكتبة محسنة للعمل في الأنظمة عالية التحميل.
  • دعم الاشتراكات (Subscriptions): إمكانية تنفيذ وظائف الوقت الفعلي عبر WebSocket.
  • المرونة: سهولة التكامل مع قواعد البيانات، وذاكرة التخزين المؤقت، والخدمات الأخرى.


التثبيت والإعداد



للبدء، يجب تثبيت gqlgen وتهيئة المشروع:



// تثبيت المكتبةgo get github.com/99designs/gqlgen@latest

// تهيئة هيكل المشروعgo run github.com/99designs/gqlgen init


بعد تنفيذ الأمر init، سيتم إنشاء هيكل المشروع:

  • graph/schema.graphqls — ملف المخطط.
  • graph/resolver.go — المحلل الجذري.
  • graph/schema.resolvers.go — النماذج الأولية المولدة للمحللات.
  • server.go — نقطة الدخول لتشغيل الخادم.


تحديد مخطط GraphQL



في ملف schema.graphqls يتم وصف الأنواع والاستعلامات والتحويرات. مثال لمخطط نظام مدونات:



# تعريف نوع Usertype User {  id: ID!  name: String!  email: String!  posts: [Post!]!}

# تعريف نوع Posttype Post { id: ID! title: String! content: String! author: User!}

# نوع الاستعلام الجذريtype Query { user(id: ID!): User users: [User!]! post(id: ID!): Post posts: [Post!]!}

# نوع التحوير الجذريtype Mutation { createUser(name: String!, email: String!): User! createPost(title: String!, content: String!, authorId: ID!): Post!}


توليد الكود وتنفيذ المحللات



بعد وصف المخطط، نقوم بتشغيل توليد الكود:



go run github.com/99designs/gqlgen generate


ستقوم المكتبة بإنشاء ملفات بهياكل Go وواجهات. الآن يجب تنفيذ المحللات — الدوال التي تعيد البيانات. مثال على تنفيذ محلل لجلب مستخدم:



// graph/schema.resolvers.go (مثال على التنفيذ)func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) {    // منطق جلب المستخدم من قاعدة البيانات    user, err := r.db.GetUserByID(ctx, id)    if err != nil {        return nil, err    }    return user, nil}

func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) { // منطق جلب قائمة جميع المستخدمين return r.db.GetAllUsers(ctx)}

// محلل حقل posts لدى User (حل البيانات المتداخلة)func (r *userResolver) Posts(ctx context.Context, obj *model.User) ([]*model.Post, error) { // obj هو كائن User الذي يتم طلب المنشورات له

توصيات