PostgreSQL ve Go: database/sql vs pgx Karşılaştırması

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Top Poster Of Month
Katılım
7 Ocak 2026
Mesajlar
234
Tepkime puanı
2
Puanları
18

Standart mı, Özelleşmiş mi?​

Go'da veritabanı denilince akla ilk gelen standart kütüphane olan database/sql paketidir. Bu paket, MySQL, SQLite veya Postgres fark etmeksizin ortak bir arayüz sunar. Ancak PostgreSQL'in kendine has (Array, JSONB, Copy Protocol) gibi süper güçleri vardır ve standart paket bunları tam olarak desteklemez.

İşte burada sahneye pgx çıkar. pgx, sadece PostgreSQL için yazılmış, Go'nun standart kütüphanesinden bağımsız (ama uyumlu çalışabilen) ve performans odaklı bir sürücüdür.

Neden​

  1. Performans: pgx, PostgreSQL'in "Binary Format"ını kullanır. Verileri metne (string) çevirip göndermek yerine, doğrudan binary (0 ve 1) olarak gönderir. Bu, CPU kullanımını azaltır ve hızı artırır.
  2. Özel Tipler: PostgreSQL'deki []text (Array), hstore veya jsonb gibi tipleri Go struct'larına veya slice'larına otomatik eşler.
  3. Connection Pool (pgxpool): Standart sql.DB havuz yönetimi iyidir ama pgxpool çok daha yetenekli ve özelleştirilebilirdir.
  4. Copy Protocol: Milyonlarca satır veriyi veritabanına ekleyecekseniz INSERT komutu yavaştır. pgx'in Copy desteği ile bu işlem saniyelere düşer.

Kod Karşılaştırması​

Yöntem 1: Standart database/sql (lib/pq sürücüsü ile - Artık önerilmiyor)
Kod:
import ("database/sql"_ "github.com/lib/pq")

func main() {db, _ := sql.Open("postgres", "postgres://user:pass@localhost:5432/mydb")// Standart sorgurows, _ := db.Query("SELECT name FROM users WHERE id = $1", 1)}

Yöntem 2: Yüksek Performanslı pgx (Native Interface)
Kod:
package main

import ("context""fmt""github.com/jackc/pgx/v5""os")

func main() {// 1. Bağlantı (Context kullanımı zorunludur)conn, err := pgx.Connect(context.Background(), "postgres://user:pass@localhost:5432/mydb")if err != nil {fmt.Fprintf(os.Stderr, "Bağlantı hatası: %v\n", err)os.Exit(1)}defer conn.Close(context.Background())

// 2. Sorgu (QueryRow)<br>var name string<br>var attributes map[string]interface{} // JSONB desteği<br><br>// PostgreSQL'e özgü tipleri (JSONB) doğrudan map'e atabiliriz<br>err = conn.QueryRow(context.Background(), "SELECT name, attributes FROM users WHERE id=$1", 1).Scan(&amp;name, &amp;attributes)<br><br>if err != nil {<br>    fmt.Println("Sorgu hatası:", err)<br>}<br><br>fmt.Println("Kullanıcı:", name, "Özellikler:", attributes)<br>
}

Sonuç​

Eğer projeniz basitse ve veritabanını ileride değiştirebilirim diyorsanız database/sql kullanın. Ancak ciddi bir PostgreSQL projesi yapıyorsanız, performans ve özellik zenginliği için endüstri standardı kesinlikle pgx'tir.
 
Geri
Üst