Study
Actix

Integrasi Database dengan sqlx

Penjelasan

Actix-web sendiri tidak menyertakan ORM bawaan (berbeda dari Rails dengan Active Record) — kamu bebas memilih library database, dua yang paling populer di ekosistem Rust adalah `sqlx` (async, query SQL mentah dengan pengecekan tipe saat compile) dan `diesel` (ORM sinkron dengan query builder type-safe). Untuk `sqlx`, kamu biasanya membuat connection pool sekali di `main`, lalu membagikannya ke semua handler lewat `web::Data` (seperti pola application state yang sudah dibahas sebelumnya) supaya setiap handler bisa menjalankan query tanpa membuat koneksi baru setiap request.

Contoh Konsep

use actix_web::{get, web, App, HttpServer, Responder};
use sqlx::PgPool;

#[get("/catatan/{id}")]
async fn detail_catatan(pool: web::Data<PgPool>, id: web::Path<i32>) -> impl Responder {
    let hasil = sqlx::query!("SELECT judul FROM catatan WHERE id = $1", *id)
        .fetch_one(pool.get_ref())
        .await;

    match hasil {
        Ok(row) => format!("Judul: {}", row.judul),
        Err(_) => "Catatan tidak ditemukan".to_string(),
    }
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let pool = PgPool::connect("postgres://user:pass@localhost/catatan_db").await.unwrap();

    HttpServer::new(move || {
        App::new()
            .app_data(web::Data::new(pool.clone()))
            .service(detail_catatan)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

Praktikum

Lengkapi pendaftaran connection pool sebagai shared application state.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Perhatikan bahwa `sqlx` memakai placeholder `$1`, `$2` dst (bukan `?` seperti Active Record) untuk query PostgreSQL — placeholder ini otomatis di-parameterize sehingga tetap aman dari SQL injection.