مقدمة: لماذا Go وقواعد البيانات ثنائي مثالي
Go (Golang) هي لغة مُجمَّعة، ومُكتوبة بشكل ثابت، صُممت للأداء العالي وسهولة التطوير. واحدة من المزايا الرئيسية لـ Go هي مكتبتها القياسية الغنية ونظام برامج التشغيل (drivers) للعمل مع قواعد البيانات. في هذه المقالة، سنشرح كيفية الاتصال وتنفيذ العمليات مع اثنين من أشهر أنظمة إدارة قواعد البيانات (DBMS): PostgreSQL العلائقية و MongoDB الموجهة للوثائق.
سننظر في تثبيت برامج التشغيل، وكتابة عمليات CRUD (إنشاء، قراءة، تحديث، حذف)، وأفضل الممارسات لكل نوع من قواعد البيانات في سياق تطبيقات Go.
1. العمل مع PostgreSQL في Go
PostgreSQL هو نظام إدارة قواعد بيانات علائقية-كائنية (ORDBMS) قوي ومفتوح المصدر. للعمل معه في Go، هناك العديد من برامج التشغيل، لكن الأكثر شيوعًا هي lib/pq و pgx. pgx هو الأحدث والأكثر أداءً، لذلك سنستخدمه.
1.1. تثبيت برنامج التشغيل (Driver)
قم بتثبيت الحزمة pgx عبر go get:
go get github.com/jackc/pgx/v51.2. الاتصال بقاعدة البيانات
لنقم بإنشاء ملف main.go وإنشاء اتصال بـ PostgreSQL. لاحظ استخدام السياق (context.Background()) - هذا هو النمط القياسي في Go لإدارة دورة حياة الاستعلامات.
package main
import ( "context" "fmt" "log"
"github.com/jackc/pgx/v5/pgxpool")
func main() { // سلسلة الاتصال: postgres://username:password@host:port/dbname connString := "postgres://user:password@localhost:5432/mydb" // إنشاء مجموعة اتصالات (موصى بها للإنتاج) pool, err := pgxpool.New(context.Background(), connString) if err != nil { log.Fatal("فشل إنشاء مجموعة الاتصالات:", err) } defer pool.Close() // التحقق من الاتصال err = pool.Ping(context.Background()) if err != nil { log.Fatal("فشل الاتصال بقاعدة البيانات:", err) } fmt.Println("تم الاتصال بنجاح بـ PostgreSQL!")}1.3. تنفيذ استعلامات SQL (CRUD)
سننظر في العمليات الأساسية باستخدام مثال جدول users.
إنشاء الجدول (CREATE)
// تنفيذ استعلام DDL_, err = pool.Exec(context.Background(), ` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT )`)if err != nil { log.Fatal("خطأ في إنشاء الجدول:", err)}إدراج البيانات (INSERT)
// إدراج مع إرجاع المعرفvar userID interr = pool.QueryRow(context.Background(), "INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING id", "أليكسي", "alex@example.com", 30).Scan(&userID)if err != nil { log.Fatal("خطأ في الإدراج:", err)}fmt.Printf("تمت إضافة مستخدم بالمعرف: %d", userID)قراءة البيانات (SELECT)
// الحصول على مستخدم واحدtype User struct { ID int Name string Email string Age int}
var user Usererr = pool.QueryRow(context.Background(), "SELECT id, name, email, age FROM users WHERE id = $1", 1). Scan(&user.ID, &user.Name, &user.Email, &user.Age)if err != nil { log.Fatal("المستخدم غير موجود:", err)}fmt.Printf("تم العثور على: %+v", user)التحديث والحذف (UPDATE/DELETE)
// تحديث_, err = pool.Exec(context.Background(), "UPDATE users SET age = $1 WHERE id = $2", 31, 1)
// حذف_, err = pool.Exec(context.Background(), "DELETE FROM users WHERE id = $1", 1)2. العمل مع MongoDB في Go
MongoDB هي قاعدة بيانات NoSQL رائدة، تخز