Go Sqlx Kütüphanesi Hakkında Notlar
Go/Sqlx Kütüphanesi Hakkında Notlar
Bu yazıda sqlx’le çalışırken öğrendiğim bazı bilgiler ve dikkat edilmesi gereken bir takım nüanslar yazılacaktır.
- PostgreSQL’e query atarken query string’i içerisindeki dinamik alanlar, $1,$2,$3 şeklinde dolar işareti-sayı olacak şekilde ifade edilir.
- MySQL’de ise tüm dinamik alanlar ? ile işaretlenir.
- Tek bir satırı veya kolonu Select ile seçmek istendiğinde sqlx.DB.Select() değil, sqlx.DB.Get() kullanılmalıdır. Zira Select slice tipinde değişken istiyor.
Yazılanlara örnek bir kod parçası yazalım,
var totalPurchasedQuantity int
err := d.db.Get(&totalPurchasedQuantity, "SELECT SUM(quantity) FROM purchases Where ticket_option_id=$1", p.UserID)
if err != nil {
return err
}
ÖNEMLİ: Get veya Select ile veri çekmeye çalışırken db’den hiç kayıt dönmezse, fonksiyona verdiğimiz değişkene 0 veya nil değeri atanmıyor hata dönüyor. Örneğin aşağıdaki kod hata döner:
toplam := 0
err := d.db.Get(&toplam, `SELECT SUM(sutun) FROM tablo Where imkansiz_olasilik = 1`)
if err != nil {
return err
}
Bunun önüne geçmek için 2 yol var,
- db/sql kütüphanesi içindeki sql.NullString, sql,NullInt gibi nullable değerleri kullanmak. Bu yolu şahsen hiç sevmedim çünkü bu değerler Int veya String’e cast edilemediği gibi alakasız bir veritipiyle uğraşmış oluyoruz.
- Benim de tercih ettiğim çözüm, Sql’deki COALESCE fonksiyonunu kullanmak. Aynı kodu bu çözüme göre düzeltirsek,
toplam := 0
err := d.db.Get(&toplam, `SELECT COALESCE(SUM(sutun), 0) FROM tablo Where imkansiz_olasilik = 1`)
if err != nil {
return err
}
Burada db’ye eğer SUM(sutun) ifadesi null gelirse 0 olarak döndür diyoruz. Bu sayede toplam değişkenine 0 atanmış oldu.
Leave a comment