AzLearn

أساسيات SQL

SQL Basics

مفهوم ~18 دقيقة

أساسيات SQL — SQL Basics

حزمة database/sql هي الواجهة الموحدة للتعامل مع قواعد البيانات العلائقية في Go. التصميم ذكي: الحزمة تُعرّف الواجهة، والمشغّلات (drivers) تُنفّذها لكل قاعدة بيانات.

ملاحظة: أمثلة قواعد البيانات لا يمكن تشغيلها مباشرة على Go Playground لأنها تحتاج قاعدة بيانات فعلية. الكود هنا للقراءة والفهم — جرّبه محلياً.

بنية الحزمة

database/sql (الواجهة — Interface)
مشغّل (Driver)
قاعدة البيانات (PostgreSQL / MySQL / SQLite)

المشغّلات الشائعة:

  • PostgreSQL: github.com/lib/pq أو github.com/jackc/pgx
  • MySQL: github.com/go-sql-driver/mysql
  • SQLite: github.com/mattn/go-sqlite3

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

main.go

sql.Open ليست اتصالاً!

نقطة مهمة يُخطئ فيها كثير من المبتدئين:

  • sql.Open تُعدّ pool اتصالات — لا تفتح اتصالاً فعلياً
  • db.Ping() يفتح أول اتصال ويتحقق
  • *sql.DB آمن للاستخدام من عدة goroutines (thread-safe)
  • أنشئ *sql.DB واحد واستخدمه في كل التطبيق

إعدادات pool الاتصالات

db.SetMaxOpenConns(25)                  // أقصى اتصالات مفتوحة
db.SetMaxIdleConns(25)                  // أقصى اتصالات خاملة
db.SetConnMaxLifetime(5 * time.Minute)  // عمر الاتصال

الاستعلام — Query, QueryRow, Exec

main.go

مثال كامل (للتشغيل محلياً)

main.go

الحماية من SQL Injection

لا تضع قيم المستخدم في النص مباشرة! استخدم المعاملات الموضعية:

// ❌ خطير — SQL injection!
query := fmt.Sprintf("SELECT * FROM users WHERE name = '%s'", userInput)

// ✅ آمن — Parameterized query
db.Query("SELECT * FROM users WHERE name = $1", userInput)

المعاملات الموضعية:

  • PostgreSQL: $1, $2, $3
  • MySQL: ?, ?, ?
  • SQLite: ?, ?, ? أو $1, $2, $3

التعامل مع NULL

main.go
تحدي — Challenge