Study
Rocket

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

Editor Latihan

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