如何在 rocket.rs Fairing 中获取数据库连接

How to get the database Connection in rocket.rs Fairing

如何使用 rocket_sync_db_pools 在 Rust Rocket (0.5-rc1) 的 Fairing 中访问数据库?

在路由中,我可以像这样将其作为参数请求:

#[get("/")]
pub async fn index(db: Database) -> Json<Index> {
    ...
}

但是在注册一个AdHoc Fairing时,我该如何查询数据库?

rocket::build()
    .attach(Template::fairing())
    .attach(Database::fairing())
    .attach(AdHoc::on_liftoff("Startup Check", |rocket| {
        Box::pin(async move {
            // Want to access the database here
        })
    }))
    ...

找到解决方案:数据库宏为此创建了一个 get_one 方法。请参阅此处的文档:https://api.rocket.rs/v0.5-rc/rocket_sync_db_pools/attr.database.html

可以这样使用:

#[database("db")]
pub struct Database(diesel::SqliteConnection);

rocket::build()
    .attach(Template::fairing())
    .attach(Database::fairing())
    .attach(AdHoc::on_liftoff("Startup Check", |rocket| {
        Box::pin(async move {
            let db = Database::get_one(rocket).await.unwrap();
            // use db instance ...
        })
    }))
    ...