0Pricing
Go Academy · درس

العبارات المجهّزة

شغّل الاستعلامات المعلَّمة بالمعاملات

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

ما هي العبارة المُعدّة

ترسل العبارة المُعدّة نص SQL إلى قاعدة البيانات مرة واحدة لتحليله ووضع خطة لتنفيذه، ثم تنفّذه عدة مرات باستخدام معاملات مختلفة. وهي أسرع للاستعلامات المتكررة وأكثر أمانًا ضد حقن SQL.

عناصر نائبة للمعاملات

لا تنشئوا SQL عبر ربط مدخلات المستخدم نصيًا. استخدموا عناصر نائبة حتى يرسل برنامج التشغيل القيم منفصلة. تستخدم PostgreSQL $1, $2، بينما تستخدم MySQL وSQLite ?.

SELECT * FROM users WHERE age > $1 AND city = $2

لماذا يوقف هذا الحقن

لأن المعاملات تنتقل منفصلة عن نص SQL، تتعامل قاعدة البيانات معها باعتبارها بيانات فقط، ولا تعتبرها شيفرة أبدًا. وتصبح قيمة ضارة مثل " OR 1=1 سلسلة نصية حرفية، لا SQL قابلًا للتنفيذ.

db.Prepare

تعيد Prepare قيمة *sql.Stmt مرتبطة بالتجمع. ثم تستدعون Exec أو Query على العبارة مع تمرير المعاملات.

stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES($1, $2)")
if err != nil {
    log.Fatal(err)
}
defer stmt.Close()

تنفيذ العبارة

استدعوا stmt.Exec مع تمرير معامل لكل عنصر نائب. بالنسبة إلى عمليات الإدراج والتحديث، تعيد Exec قيمة sql.Result التي تتضمن عدد الصفوف المتأثرة ومعرّف الإدراج الأخير.

res, err := stmt.Exec("Ada", 36)
if err != nil {
    log.Fatal(err)
}
n, _ := res.RowsAffected()
fmt.Println("inserted", n)

إعادة الاستخدام داخل حلقة

تأتي الفائدة من إعادة الاستخدام: جهّزوا العبارة مرة واحدة، ونفّذوها مرات عديدة داخل حلقة. تعيد قاعدة البيانات استخدام خطة التحليل الخاصة بها في كل استدعاء.

for _, u := range users {
    if _, err := stmt.Exec(u.Name, u.Age); err != nil {
        log.Fatal(err)
    }
}

الإعداد الضمني

يؤدي تمرير المعاملات مباشرةً إلى db.Query أو db.Exec أيضًا إلى استخدام العناصر النائبة بأمان؛ وقد يجهّز برنامج التشغيل العبارة داخليًا. وتكمن أهمية Prepare الصريح أساسًا في التنفيذ المتكرر.

محاكاة قابلة للتشغيل لربط المعاملات

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

package main

import "fmt"

func execPrepared(query string, args ...interface{}) string {
    return fmt.Sprintf("EXEC %q with args %v", query, args)
}

func main() {
    q := "INSERT INTO users(name, age) VALUES($1, $2)"
    people := [][2]interface{}{{"Ada", 36}, {"Lin", 41}}
    for _, p := range people {
        fmt.Println(execPrepared(q, p[0], p[1]))
    }
}

إصدارات Context

استخدم PrepareContext وstmt.ExecContext لكي تحترم الاستدعاءات المُعدّة المهلات الزمنية والإلغاء، تمامًا مثل بقية حزمة database/sql.

أغلق Stmt دائمًا

يحتفظ *sql.Stmt بموارد على قاعدة البيانات. استخدم stmt.Close() المؤجل عند الانتهاء. قد يؤدي تسريب العبارات إلى استنفاد حدود العبارات المُعدّة على الخادم.

العبارات وتجميع الاتصالات

تعمل العبارة المُعدّة على *sql.DB عبر الاتصالات المجمّعة؛ إذ تعيد المكتبة إعدادها على أي اتصال تقع عليه. لا تحتاج عادةً إلى إدارة ذلك بنفسك.

تحقق سريع

اختبر معرفتك بالعبارات المُعدّة.

مراجعة

لقد تعلمت العبارات المُعدّة:

  • يحلّل Prepare العبارة مرة واحدة، ثم ينفّذها مرات عديدة
  • تحافظ العناصر النائبة ($1 أو ?) على القيم بوصفها بيانات، فتمنع حقن SQL
  • يعيد stmt.Exec عدد الصفوف المتأثرة؛ استخدم stmt.Close() مؤجلًا
  • أعد استخدامها في الحلقات؛ واستخدم إصدارات Context للمهلات النهائية

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

هل درس «العبارات المجهّزة» مجاني؟

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

ماذا ستتعلم في «العبارات المجهّزة»؟

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

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

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

كم من الوقت يستغرق درس «العبارات المجهّزة»؟

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

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

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

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

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