Go Academy · درس

فتح اتصال

اتصل بقاعدة بيانات

الدرس 1 من 413 خطوة

فتح اتصال درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

حزمة database/sql

توفّر حزمة database/sql القياسية في Go واجهة عامة مستقلة عن قاعدة البيانات. وتقرنونها ببرنامج تشغيل لقاعدة البيانات المحددة، مثل PostgreSQL أو MySQL.

  • واجهة واحدة وقواعد بيانات عديدة
  • تجميع مضمّن للاتصالات
  • استعلامات آمنة ذات معاملات

استيراد برنامج تشغيل

يسجّل برنامج التشغيل نفسه عبر استيراد فارغ. وتعني الشرطة السفلية أنكم تستوردونه لتأثيره الجانبي، أي التسجيل، لا لاستدعائه مباشرة.

import (
    "database/sql"
    _ "github.com/lib/pq"
)

sql.Open

تأخذ sql.Open اسم برنامج التشغيل واسم مصدر البيانات (DSN). ولا تنشئ اتصالًا فعليًا بعد؛ بل تجهّز التجمع فقط.

db, err := sql.Open("postgres", "postgres://user:pass@localhost/mydb?sslmode=disable")
if err != nil {
    log.Fatal(err)
}

db هو تجمع

إن *sql.DB المُعاد ليس اتصالًا واحدًا، بل تجمع اتصالات آمن للاستخدام المتزامن من قِبل العديد من goroutines. افتحوه مرة واحدة وشاركوه عبر تطبيقكم.

التحقق باستخدام Ping

بما أن Open كسول، استخدموا Ping لإنشاء اتصال فعليًا والتأكد من إمكانية الوصول إلى قاعدة البيانات وصحة بيانات الاعتماد.

if err := db.Ping(); err != nil {
    log.Fatal("cannot reach db:", err)
}

إغلاق التجمع

أجّلوا db.Close() باستخدام defer في دالتكم الرئيسية أو دالة الإعداد. نادرًا ما تغلقون الاتصال لكل استعلام؛ بل تغلقونه فقط عند إيقاف التطبيق بالكامل.

defer db.Close()

ضبط التجمع

تحكّموا في التجمع باستخدام SetMaxOpenConns وSetMaxIdleConns وSetConnMaxLifetime. تمنع هذه الدوال استنفاد قاعدة البيانات، وتعيد تدوير الاتصالات القديمة.

db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)

مثال قابل للتشغيل داخل الذاكرة

تحتاج برامج التشغيل الحقيقية إلى قاعدة بيانات عبر الشبكة، لذلك يوضّح هذا المثال القابل للتشغيل دورة الحياة نفسها من خلال محاكاة الفتح وPing باستخدام أنواع المكتبة القياسية فقط.

package main

import (
    "errors"
    "fmt"
)

type DB struct{ dsn string }

func Open(driver, dsn string) (*DB, error) {
    if dsn == "" {
        return nil, errors.New("empty dsn")
    }
    return &DB{dsn: dsn}, nil
}

func (db *DB) Ping() error { return nil }
func (db *DB) Close() error { return nil }

func main() {
    db, err := Open("postgres", "postgres://localhost/mydb")
    if err != nil {
        fmt.Println("open error:", err)
        return
    }
    defer db.Close()
    if err := db.Ping(); err != nil {
        fmt.Println("ping error:", err)
        return
    }
    fmt.Println("connected to", db.dsn)
}

البدائل المراعية لـ context

فضّلوا PingContext وQueryContext وExecContext حتى تحترم الاستدعاءات المهل الزمنية والإلغاء. ويحدّد تمرير context المدة التي يمكن لاستدعاء قاعدة بيانات عالق أن يستمر خلالها في حجب التنفيذ.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
err := db.PingContext(ctx)

تنسيق DSN

يحدّد كل برنامج تشغيل تنسيق DSN الخاص به. تقبل PostgreSQL عنوان URL، بينما تستخدم MySQL الصيغة user:pass@tcp(host:3306)/dbname. راجعوا دائمًا وثائق برامج التشغيل، وتجنبوا تضمين بيانات الاعتماد مباشرة في الشيفرة.

تجمع واحد طويل العمر

من الأخطاء الشائعة استدعاء sql.Open لكل طلب. فهذا يلغي فائدة التجميع ويستنفد الاتصالات. افتحوا التجمع مرة واحدة عند بدء التشغيل، وخزّنوا *sql.DB، وأعيدوا استخدامه في كل مكان.

تحقق سريع

اختبروا معرفتكم بالاتصالات.

مراجعة

لقد تعلّمتم فتح اتصال:

  • استوردوا برنامج التشغيل استيرادًا فارغًا، واستدعوا sql.Open باستخدام برنامج التشغيل وDSN
  • يمثّل *sql.DB تجمعًا آمنًا للتزامن، ويُفتح مرة واحدة
  • يتحقق Ping من الاتصال الفعلي
  • اضبطوا التجمع واستخدموا الدوال المراعية لـ context
  • استخدموا defer db.Close() عند إيقاف التشغيل
البدء مجانًا

تعلم Go مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «فتح اتصال» مجاني؟

نعم — نص درس «فتح اتصال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «فتح اتصال»؟

اتصل بقاعدة بيانات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «فتح اتصال»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فتح اتصال
  2. الاستعلام عن الصفوف
  3. العبارات المجهّزة
  4. المعاملات
← العودة إلى Go Academy