0Pricing
Go Academy · درس

الاستعلام عن الصفوف

اقرأ مجموعات النتائج

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

الاستعلام عن مجموعات النتائج

استخدموا Query للعبارات التي تعيد صفوفًا، مثل SELECT. فهي تعيد *sql.Rows الذي تتنقلون بين صفوفه. أما للحصول على قيمة واحدة، فـ QueryRow أبسط.

db.Query

ترسل Query جملة SQL وتعيد الصفوف إلى جانب خطأ. افحصوا الخطأ دائمًا قبل استخدام الصفوف.

rows, err := db.Query("SELECT id, name FROM users WHERE active = $1", true)
if err != nil {
    log.Fatal(err)
}

أجّلوا دائمًا rows.Close()

تحتفظ الصفوف باتصال قاعدة البيانات حتى إغلاقها. تعيد defer rows.Close() الاتصال إلى التجمع. يؤدي نسيان ذلك إلى تسريب الاتصالات تحت الحمل.

defer rows.Close()

التكرار باستخدام rows.Next

تنقل rows.Next() إلى الصف التالي، وتعيد false عند الانتهاء. تستدعون داخل الحلقة Scan لنسخ قيم الأعمدة إلى المتغيرات.

for rows.Next() {
    var id int
    var name string
    if err := rows.Scan(&id, &name); err != nil {
        log.Fatal(err)
    }
    fmt.Println(id, name)
}

تأخذ Scan مؤشرات

تكتب Scan في المتغيرات التي تمررونها، لذلك يجب تمرير مؤشرات (&id و&name). يجب أن يطابق عدد المؤشرات وترتيبها الأعمدة المحددة.

فحص rows.Err

قد تنتهي الحلقة بسبب نفاد البيانات أو بسبب حدوث خطأ أثناء التكرار. بعد الحلقة، استدعوا rows.Err() لالتقاط أي خطأ أثناء التكرار.

if err := rows.Err(); err != nil {
    log.Fatal(err)
}

QueryRow لصف واحد

عندما تتوقعون صفًا واحدًا بالضبط، يكون الجمع بين QueryRow وScan أنظف. وإذا لم يطابق أي صف، فإن Scan يعيد sql.ErrNoRows.

var name string
err := db.QueryRow("SELECT name FROM users WHERE id = $1", 7).Scan(&name)
if err == sql.ErrNoRows {
    fmt.Println("not found")
}

محاكاة Scan قابلة للتشغيل

يحتاج الاستعلام الحقيقي إلى قاعدة بيانات، لذلك يحاكي هذا المثال القابل للتشغيل تدفق Query وNext وScan عبر شريحة داخل الذاكرة لإظهار نمط التكرار.

package main

import "fmt"

type Row struct {
    ID   int
    Name string
}

func main() {
    rows := []Row{{1, "Ada"}, {2, "Lin"}, {3, "Guido"}}
    for i := 0; i < len(rows); i++ {
        var id int
        var name string
        id = rows[i].ID
        name = rows[i].Name
        fmt.Printf("id=%d name=%s\n", id, name)
    }
    fmt.Println("scanned", len(rows), "rows")
}

معالجة NULL

لا يمكن مسح عمود NULL إلى string أو int عادي. استخدموا sql.NullString أو sql.NullInt64 أو نوع مؤشر حتى تتمكن الشيفرة من التمييز بين NULL والقيمة الفارغة.

var email sql.NullString
rows.Scan(&email)
if email.Valid {
    fmt.Println(email.String)
}

المسح إلى الهياكل

تمسح المكتبة القياسية إلى متغيرات فردية، لا إلى هياكل كاملة. اربطوا الأعمدة بحقول الهيكل عبر تمرير &u.ID, &u.Name. وتعمل مكتبات مثل sqlx على أتمتة ذلك.

تجنبوا SELECT *

أدرجوا الأعمدة صراحةً حتى يظل ترتيب Scan ثابتًا. سيؤدي تغيير المخطط الذي يضيف عمودًا إلى كسر Scan الموضعي بصمت إذا اعتمدتم على SELECT *.

تحقق سريع

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

مراجعة

لقد تعلّمتم الاستعلام عن الصفوف:

  • يعيد Query قيمة *sql.Rows؛ استخدموا defer rows.Close()
  • كرّروا باستخدام rows.Next، وانسخوا القيم عبر Scan إلى مؤشرات
  • افحصوا rows.Err() بعد الحلقة
  • استخدموا QueryRow للصفوف المفردة؛ وsql.ErrNoRows عند عدم العثور على صف
  • استخدموا أنواع Null للأعمدة التي تقبل NULL

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

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

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

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

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

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

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

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

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

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

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

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

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