【问题标题】:How do I pass a database connection to Rocket endpoints and functions?如何将数据库连接传递给 Rocket 端点和函数?
【发布时间】:2021-01-01 22:42:03
【问题描述】:

我的 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 连接并传递它?

【问题讨论】:

    标签: mysql rust rust-rocket


    【解决方案1】:

    您需要告诉 Rocket 您的数据库。这是通过Fairings 完成的。您链接的文档实际上将它们包含在一个示例中:

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

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

    【讨论】:

    • 我正在使用这个实现,它在本地工作,假设数据库存在。但是,我想从 Docker 环境和这个环境中运行我的火箭 API;当 api 启动时,我的数据库不(总是)存在,有时它启动较晚,有时根本不存在。我该怎么做才能让火箭在启动后重试连接?
    • @milovanderlinden 查看docs.docker.com/compose/startup-order 了解您的问题的一些解决方案。如果它们都不适合你,最好创建一个新问题并用 Docker 标记它。
    猜你喜欢
    • 1970-01-01
    • 2021-03-03
    • 2011-03-15
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2015-09-11
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多