Go Sqlx Kütüphanesi Hakkında Notlar

1 minute read

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,

  1. 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.
  2. 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.

Updated:

Leave a comment