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