如何将数据库连接传递到Rocket端点和函数?

问题描述

我的Web应用程序通过Rocket具有REST API,连接到MysqL数据库,并且只有一个端点。我无法弄清楚如何访问控制器内部的数据库连接:

#![feature(decl_macro)]
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate rocket_contrib;

use rocket_contrib::json::Json;
use serde::Serialize;

#[macro_use]
extern crate MysqL;
use MysqL as my;
use MysqL::consts::ColumnType::MysqL_TYPE_DATE;
use MysqL::prelude::Queryable;
use MysqL::Pool;

#[get("/orgs")]
fn get_orgs(conn: MyDb) -> Json<Vec<Org>> {
    // I need to have the db connection here to pass it to get_all.
    let o = match Org::get_all() {
        Ok(o) => o,Err(e) => panic!(e),};

    Json(o)
}

#[derive(Serialize)]
pub struct Org {
    pub id: Option<i32>,pub name: String,}

fn main() {
    let url = "MysqL://root:MysqL@(localhost:33061)/somedb";
    let pool = Pool::new(url)?;
    let mut conn = pool.get_conn();
    // I need to pass "conn" around,first to get_orgs,then to Org::get_all.
    rocket::ignite().mount("/",routes![get_orgs]).launch();
}

impl Org {
    fn get_all(mut conn: MysqL::Conn) -> Result<Vec<Org>,Err> {
        let all_orgs = conn.query_map("SELECT id,name from organization",|(id,name)| Org {
            id,name,})?;

        return match all_orgs() {
            Ok(all_orgs) => all_orgs,Err(e) => e,};
    }
}

我的假设是#[get("/orgs")]进行了大量代码生成。我发现了这一点:https://rocket.rs/v0.4/guide/state/#databases-看起来正确,但是我无法找出一个有效的示例通过连接字符串连接到我的MysqL实例。

这是我的依赖项:

[dependencies]
rocket = "0.4.2"
rocket_codegen = "0.4.2"
rocket_contrib = "0.4.2"
serde = {version = "1.0",features = ["derive"]}
serde_json = {version = "1.0"}
MysqL = "*"

如何建立MysqL连接并传递它?

解决方法

您需要告知Rocket您的数据库。这是通过Fairings完成的。您链接的文档实际上包括一个示例:

fn main() {
    rocket::ignite()
       .attach(LogsDbConn::fairing())
       .launch();
}

上面的重要部分是attach,其中数据库连接作为整流罩传递给Rocket。只有这样,Rocket才能将连接传递到您的路线,以便您可以使用它...