SQLx: Derleme Zamanında SQL Sorgu Kontrolü

  • 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
290
Tepkime puanı
2
Puanları
18
Rust ekosisteminde veritabanı işlemleri için iki ana yol vardır: Ya Diesel gibi bir ORM (Object-Relational Mapper) kullanırsınız ya da veritabanına daha yakın olan, ham SQL yazmanıza izin veren bir kütüphane seçersiniz. SQLx, bu ikinci yolun tartışmasız lideridir.
SQLx'in en "devrimsel" özelliği, yazdığınız SQL sorgularını derleme zamanında (compile-time) veritabanınıza bağlanarak kontrol etmesidir.

1. Neden SQLx? (Compile-time Safety)​

Diğer dillerde bir SQL sorgusunda hata yaparsanız (örneğin bir tablo adını yanlış yazarsanız), bu hatayı ancak programı çalıştırıp o kod satırı tetiklendiğinde anlarsınız. SQLx'te ise:
  • Sorgunuzdaki yazım hataları,
  • Yanlış sütun isimleri,
  • Tip uyuşmazlıkları (veritabanında Integer olan bir alanı Rust'ta String ile karşılamak gibi),
henüz kod derlenirken bir hata mesajı olarak karşınıza çıkar. Eğer SQL hatalıysa, kodunuz derlenmez.

2. Temel Kurulum ve Bağlantı Havuzu​

SQLx tamamen asenkrondur ve Tokio veya async-std ile mükemmel çalışır. PgPool (PostgreSQL için) gibi yapılarla bağlantı havuzunu yönetir.
Rust
Kod:
use sqlx::postgres::PgPoolOptions;

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    // Veritabanı bağlantı havuzu oluşturma
    let pool = PgPoolOptions::new()
        .max_connections(5)
        .connect("postgres://kullanici:sifre@localhost/veritabani")
        .await?;

    Ok(())
}

3. Sorgu Çalıştırma ve query! Makrosu​

SQLx'in büyüsü query! ve query_as! makrolarında yatar. Bu makrolar, .env dosyanızdaki DATABASE_URL üzerinden canlı veritabanına bağlanır ve sorguyu doğrular.
Rust
Kod:
// Basit bir sorgu: Sonuçları anonim bir struct olarak döner
let kullanici = sqlx::query!("SELECT id, ad FROM kullanicilar WHERE id = $1", 1)
    .fetch_one(&pool)
    .await?;

println!("ID: {}, Ad: {}", kullanici.id, kullanici.ad);

Struct'lara Eşleme (Mapping)​

Veriyi doğrudan kendi tanımladığınız bir struct'a doldurmak için FromRow trait'ini kullanırsınız:
Rust
Kod:
#[derive(sqlx::FromRow)]
struct Kullanici {
    id: i32,
    ad: String,
}

let liste = sqlx::query_as!(Kullanici, "SELECT id, ad FROM kullanicilar")
    .fetch_all(&pool)
    .await?;

4. Migrations (Veritabanı Göçleri)​

SQLx, veritabanı şemanızı kod tabanınızla birlikte yönetmeniz için yerleşik bir migration desteği sunar. sqlx-cli aracılığıyla yeni tablolar oluşturabilir ve bunları versiyonlayabilirsiniz.
Bash
Kod:
sqlx migrate add tablo_olustur
# Bu komut 'migrations/' klasöründe bir .sql dosyası oluşturur

5. SQLx mi, Diesel mi?​

ÖzellikSQLxDiesel
SQL YazımıHam SQL (Kontrol edilmiş)Rust DSL (Domain Specific Language)
AsenkronYerleşik destek (Async-native)Üçüncü taraf paketlerle asenkron
Derleme HızıSorgu kontrolü nedeniyle biraz yavaşlayabilirGenellikle daha hızlı
Öğrenme EğrisiSQL biliyorsanız çok kolayRust'ın tip sistemine çok hakimiyet ister
 
Geri
Üst