Ö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
package main
import (
"errors"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
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
var ad string
err := db.QueryRow("SELECT ad FROM urunler WHERE id = ?", 3).____(&ad)
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 |