- 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
- 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.
- Özel Tipler: PostgreSQL'deki []text (Array), hstore veya jsonb gibi tipleri Go struct'larına veya slice'larına otomatik eşler.
- Connection Pool (pgxpool): Standart sql.DB havuz yönetimi iyidir ama pgxpool çok daha yetenekli ve özelleştirilebilirdir.
- 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(&name, &attributes)<br><br>if err != nil {<br> fmt.Println("Sorgu hatası:", err)<br>}<br><br>fmt.Println("Kullanıcı:", name, "Özellikler:", attributes)<br>
}