AzLearn

عمليات CRUD

CRUD Operations

تطبيق ~25 دقيقة

عمليات CRUD — CRUD Operations

CRUD هي العمليات الأربع الأساسية لأي تطبيق يتعامل مع بيانات: الإنشاء (Create)، القراءة (Read)، التحديث (Update)، والحذف (Delete). سنتعلم كيف ننفذها في Go بطريقة آمنة واحترافية.

بنية المشروع النموذجية

main.go

العبارات المُعدّة — Prepared Statements

العبارات المُعدّة تُحسّن الأداء عند تكرار نفس الاستعلام مع قيم مختلفة:

main.go

المعاملات — Transactions

المعاملات تضمن أن مجموعة عمليات تنجح كلها أو لا شيء (atomicity):

main.go

نمط المعاملة الفعلي

func TransferMoney(db *sql.DB, fromID, toID int, amount float64) error {
    // بدء المعاملة — Begin transaction
    tx, err := db.Begin()
    if err != nil {
        return fmt.Errorf("بدء المعاملة: %w", err)
    }
    // التراجع التلقائي — Auto rollback
    defer tx.Rollback()

    // خصم من المُرسل — Deduct from sender
    _, err = tx.Exec(
        "UPDATE accounts SET balance = balance - $1 WHERE id = $2 AND balance >= $1",
        amount, fromID,
    )
    if err != nil {
        return fmt.Errorf("خصم: %w", err)
    }

    // إضافة للمُستقبل — Add to receiver
    _, err = tx.Exec(
        "UPDATE accounts SET balance = balance + $1 WHERE id = $2",
        amount, toID,
    )
    if err != nil {
        return fmt.Errorf("إيداع: %w", err)
    }

    // تأكيد المعاملة — Commit
    return tx.Commit()
}

أخطاء شائعة

خطأ 1: نسيان defer rows.Close()

// ❌ تسرب اتصال!
rows, _ := db.Query("SELECT ...")
for rows.Next() { ... }

// ✅ أغلق دائماً
rows, _ := db.Query("SELECT ...")
defer rows.Close()

خطأ 2: استخدام Rollback بدون defer

// ❌ إذا حدث panic لن يتم Rollback
tx, _ := db.Begin()
// ... عمليات
tx.Commit()

// ✅ defer Rollback آمن (لا يفعل شيئاً بعد Commit)
tx, _ := db.Begin()
defer tx.Rollback()
// ... عمليات
return tx.Commit()
تحدي — Challenge