CodeBlanks Logo Icon CodeBlanks

Özet - database/sql

  • Go kursu
  • İleri seviye
  • Ders 30/68
  • 4 dk

Query ve Transaction'ı birleştirerek bir kullanıcı kaydı yazarsın.

database/sql özeti

Bu grupta sürücüyü _ ile kaydettin, sql.Open + Ping ile havuzu kurdun, Query/QueryRow/Exec ile sorgu çalıştırdın, yer tutucu ve Prepare ile güvenli sorgu yazdın ve Begin/Commit/Rollback ile transaction yönettin.

Üç alışkanlık: rows.Close() ve rows.Err() unutma, girdiyi SQL'e birleştirme, transaction içinde hep tx kullan.

Repository katmanı

Gerçek uygulamalarda SQL kodu bir repository tipinde toplanır; geri kalan kod yalnızca yöntemleri görür:

type UrunRepo struct{ db *sql.DB }

func (r UrunRepo) Ad(id int) (string, error) {
    var ad string
    err := r.db.QueryRow("SELECT ad FROM urunler WHERE id = ?", id).Scan(&ad)
    return ad, err
}

Testte bu tip bir arayüzle değiştirilip sahte veriyle denenebilir.

Uygulama Repository arayüzü

type UrunRepo interface { Ad(id int) (string, error) } tanımla. Map tabanlı type memRepo map[int]string için Ad yöntemini yaz (yoksa errors.New("yok") döndürsün). var r UrunRepo = memRepo{1: "Kalem"} ile r.Ad(1) sonucunu yazdır.

Başlangıç kodu

main.go
package main

import (
    "errors"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "errors"
    "fmt"
)

type UrunRepo interface {
    Ad(id int) (string, error)
}

type memRepo map[int]string

func (m memRepo) Ad(id int) (string, error) {
    ad, ok := m[id]
    if !ok {
        return "", errors.New("yok")
    }
    return ad, nil
}

func main() {
    var r UrunRepo = memRepo{1: "Kalem"}
    fmt.Println(r.Ad(1))
}

Beklenen çıktı

Kalem <nil>

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Döngüden sonra <code>rows.Err()</code> neden kontrol edilir?

  • Next false dönünce sebebin hata mı bitiş mi olduğunu anlamak için Doğru cevap
  • Satır sayısını almak için
  • Transaction açmak için
  • Bağlantıyı kapatmak için

Açıklama: Next hem satırlar bitince hem de okuma hatasında false döner; rows.Err() farkı söyler.

2 Sonuçları tara

Soru
var ad string
err := db.QueryRow("SELECT ad FROM urunler WHERE id = ?", 3).____(&ad)
Cevap
var ad string
err := db.QueryRow("SELECT ad FROM urunler WHERE id = ?", 3).Scan(&ad)

Açıklama: Scan sütun değerlerini verilen işaretçilere kopyalar.

3 Grubun özeti

Kavram Anlamı
sql.Open + Ping Havuz ve bağlantı testi
Query + rows.Next Çok satır okuma
? / $1 Güvenli parametre
Begin / Commit Bütünsel işlem

İleri seviye bölümündeki tüm dersler