问题描述
如何使用 Rocket_sync_db_pools 在 Rust Rocket (0.5-rc1) 的整流罩中访问数据库?
在路由中,我可以像这样请求它作为参数:
#[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 ...
})
}))
...