أساسيات 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
Output:
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
Output:
مثال كامل (للتشغيل محلياً)
main.go
Output:
الحماية من 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
Output:
تحدي — Challenge
أنشئ شريحة من المستخدمين وابحث عن الأكبر سناً