Database dengan rocket_db_pools
Penjelasan
Rocket punya crate resmi `rocket_db_pools` untuk integrasi database yang terasa "native" dengan sistem Rocket — alih-alih menyimpan pool secara manual lewat `.manage()` seperti pola umum, kamu mendefinisikan tipe database dengan derive `#[derive(Database)]`, lalu Rocket otomatis membuat dan mengelola pool tersebut berdasarkan konfigurasi di `Rocket.toml`. Setelah tipe database didaftarkan lewat `.attach(MyDb::init())`, handler bisa mengakses koneksi lewat parameter bertipe `Connection<MyDb>` — pola ini sebenarnya juga memakai request guard di baliknya (`Connection<T>` meng-implementasi `FromRequest`), jadi konsisten dengan filosofi Rocket secara keseluruhan. Konfigurasi koneksi database ditulis di `Rocket.toml` di bawah section `[default.databases.nama_db]`, misalnya `url = "postgres://user:pass@localhost/dbname"`. Rocket membaca file ini otomatis saat start, tanpa perlu kode tambahan untuk memuatnya.
Contoh Konsep
// cargo add rocket_db_pools --features sqlx_postgres
#[macro_use] extern crate rocket;
use rocket_db_pools::{sqlx, Database, Connection};
#[derive(Database)]
#[database("main_db")]
struct MainDb(sqlx::PgPool);
#[get("/notes/count")]
async fn count_notes(mut db: Connection<MainDb>) -> String {
let count: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM notes")
.fetch_one(&mut **db)
.await
.unwrap_or((0,));
format!("Jumlah catatan: {}", count.0)
}
#[launch]
fn rocket() -> _ {
rocket::build()
.attach(MainDb::init())
.mount("/", routes![count_notes])
}
// Rocket.toml:
// [default.databases.main_db]
// url = "postgres://user:password@localhost/mydb"
Praktikum
Buat handler `health` yang menerima `Connection<MainDb>` dan mengembalikan "database terhubung" tanpa query apa pun (cukup buktikan koneksi bisa di-guard).
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Kalau `main_db` di `Rocket.toml` tidak ditemukan atau salah format saat Rocket start, `MainDb::init()` gagal secara graceful (Rocket mencatat error dan tidak jadi listen) — bandingkan ini dengan pola Axum yang biasanya membaca URL dari environment variable seperti `$DATABASE_URL` secara manual lewat `std::env::var(...)` di dalam kode `main`.