如何使用actix在函数内部使用数据库池?

时间:2019-07-16 22:33:48

标签: rust rust-actix rust-diesel actix-web

我为这样的MySQL数据库创建了一个池:

res.header("Access-Control-Allow-Origin", 'http://app.com:4000');

像这样包含在actix中:

let database_url = env::var("DATABASE_URL").expect("set DATABASE_URL");

let manager = ConnectionManager::<MysqlConnection>::new(database_url);
let pool = r2d2::Pool::builder()
    .build(manager)
    .expect("Failed to create pool.");

问题来了,如何在此info函数中使用它:

HttpServer::new(move || App::new()
    .data(pool.clone()) // <-- HERE
    .service(
        web::resource("/infos")
          .route(web::post().to(get_infos))
    ))

    .bind("127.0.0.1:8080")?
    .start();

println!("Starting http server: 127.0.0.1:8080");

直接将MySQL连接的一个实例传递给get_infos很好,但是使用池我不知道如何处理它!有什么帮助吗?

为进一步说明,我的目标是使用POOLING而不是仅使用一个实例,就像该代码中的情况一样:

pub fn get_infos(conn: &MysqlConnection) -> Vec<Book> {
    all_books
        .order(books::id.desc())
        .load::<Book>(conn)
        .expect("error loading the books")
}

我在上一个代码中将POOL初始化为actix: let database_url = env::var("DATABASE_URL").expect("set DATABASE_URL"); let conn = MysqlConnection::establish(&database_url).unwrap(); // And then passing as argument "conn" to get_infos function.

但是如何将其作为参数传递给 .data(pool.clone()) // <-- HERE函数。

再次感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

对于您的经理;只需将池添加为参数,然后就可以将固定连接传递给下游函数:

// Data = actix_web::web::Data
pub fn get_all_books(pool: Data<Pool>) -> HttpResponse {
    let connection = pool.get().expect("Failed to get connection");
    let books = get_infos(&connection);

    HttpResponse::Ok().json(books)
}

pub fn get_infos(connection: &MysqlConnection) -> Vec<Book> {
    all_books
        .order(books::id.desc())
        .load::<Book>(conn)
        .expect("error loading the books")
}

答案 1 :(得分:0)

通过控制器传递池的正确答案:

let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let manager = ConnectionManager::<MysqlConnection>::new(database_url);
let pool = r2d2::Pool::builder()
.build(manager)
.expect("Failed to create pool.");
HttpServer::new(move || {
    App::new()
        .data(pool.clone())
        .route("/", web::get().to(index))
        .configure(todoController::init)
})

这有效。