#gotham #diesel #connection-pool #database-access #web #async #http

gotham_middleware_diesel

一个Gotham中间件,通过R2D2池提供对Diesel连接的访问,以便其他中间件和处理程序可以与数据库交互

7个版本 (4个重大变更)

0.5.1 2023年9月12日
0.5.0 2022年11月6日
0.4.0 2021年11月12日
0.3.1 2021年7月12日
0.1.0 2019年7月27日

482HTTP服务器

Download history 53/week @ 2024-03-11 62/week @ 2024-03-18 24/week @ 2024-03-25 102/week @ 2024-04-01 105/week @ 2024-04-08 26/week @ 2024-04-15 105/week @ 2024-04-22 30/week @ 2024-04-29 54/week @ 2024-05-06 227/week @ 2024-05-13 27/week @ 2024-05-20 9/week @ 2024-05-27 21/week @ 2024-06-03 46/week @ 2024-06-10 39/week @ 2024-06-17 22/week @ 2024-06-24

每月130 次下载
gotham_restful 中使用

MIT/Apache

570KB
10K SLoC

Gotham Diesel中间件

gotham diesel中间件提供了与Gotham交互的便捷API。

用法

此中间件引入了一个Repo结构体,该结构体用作Diesel和Gotham之间的层,以确保数据库交互可以轻松地与其他异步操作一起链式调用。这个结构体相当简单,提供了从Gotham内部与Diesel交互的简单方法

// create a new repo, in this case just using a SQLite setup
let repo: Repo<SqliteConnection> = Repo::new("products.db");

// create a middleware pipeline from our middleware
let pipeline = single_middleware(DieselMiddleware::new(repo));

// construct a basic chain from our pipeline
let (chain, pipelines) = single_pipeline(pipeline);

// build a router with the chain & pipeline
gotham::start("127.0.0.1:7878", build_router(chain, pipelines, |route| {
    route.get("/").to(say_hello);
}))

从那里,您可以在请求状态下简单访问Repo,就像使用其他中间件一样。然后,您可以使用Repo来执行数据库调用

// borrow the repo from the state
let repo = Repo::borrow_from(&state);

// execute database calls
repo.run(move |conn| {
    diesel::insert_into(products::table)
        .values(&product)
        .execute(&conn)
})

repo.run 返回一个Future,允许您在其他异步处理程序代码中无缝地添加数据库调用。Repo类型使用 tokio::task::spawn_blocking 管理底层连接的同步调用,这允许阻塞操作在不阻塞tokio反应器的情况下运行。虽然这不是真正的异步操作,但它允许处理多个并发数据库请求,默认为100个并发阻塞操作。有关详细信息,请参阅 tokio::task::spawn_blocking 文档

有关完整示例,请参阅 主仓库中的示例

配置

要自定义连接池的各个方面,您可以从一个 r2d2::Builder 构造一个repo,设置其中的任何属性

let repo = Repo::from_pool_builder(database_url,
    Pool::builder()
        .connection_timeout(Duration::from_secs(120))
        .max_size(100)

隔离的测试事务

在测试中使用时,中间件可以使用隔离的测试事务,允许测试并行运行。在测试事务中,来自不同连接的查询不会相互干扰,并且在每次测试结束时,当连接断开时,它们会被回滚。

#[test]
fn do_something() {
    let repo = Repo::with_test_transactions(DATABASE_URL);
    // Run some test code that accesses the repo.
    // This test will be isolated, and at the end the transaction rolled back.
}

有关更多详细信息,请参阅上面链接的主要存储库中的完整示例。

依赖项

~12-24MB
~331K SLoC