12 个版本 (重大更新)

0.9.0 2024年7月26日
0.8.0 2023年12月23日
0.7.0 2023年12月1日
0.6.0 2023年9月15日
0.2.0 2022年3月4日

数据库接口 中排名第 836

Download history 35/week @ 2024-04-22 87/week @ 2024-04-29 22/week @ 2024-05-06 17/week @ 2024-05-13 32/week @ 2024-05-20 51/week @ 2024-05-27 69/week @ 2024-06-03 78/week @ 2024-06-10 41/week @ 2024-06-17 59/week @ 2024-06-24 42/week @ 2024-07-01 36/week @ 2024-07-08 34/week @ 2024-07-15 147/week @ 2024-07-22 62/week @ 2024-07-29 43/week @ 2024-08-05

每月下载量 288
aide-axum-sqlx-tx 中使用

MIT 许可证

31KB
441

axum-sqlx-tx

axum 的请求范围 SQLx 事务。

摘要

axum-sqlx-tx 提供了一个 axum 提取器,用于获取请求范围的事务。事务在提取器第一次被使用时开始,并存储在请求中以供其他中间件/处理器使用。根据响应的状态码来解析事务 - 成功(2XX)的响应将提交事务,否则将回滚。

有关更多信息和使用示例,请参阅 工具包文档


lib.rs:

axum 的请求范围 SQLx 事务。

[Tx] 是一个 axum 提取器,用于获取绑定到 HTTP 请求的事务。事务在提取器第一次用于请求时开始,然后存储在 请求扩展 中,供其他中间件/处理器使用。事务的解析取决于最终响应的状态码 - 成功(HTTP 2XX3XX)的响应将导致提交事务,否则将回滚。

这种行为通常是合理的默认行为,使用提取器(例如,而不是直接使用 sqlx::Transaction)意味着您不会忘记提交事务!

使用方法

要使用 [Tx] 提取器,您首先需要将 StateLayer 添加到您的应用程序中。 State 存储提取器的配置,而 Layer 中间件管理请求相关的交易。

// It's recommended to create aliases specialised for your extractor(s)
type Tx = axum_sqlx_tx::Tx<sqlx::Sqlite>;

let pool = sqlx::SqlitePool::connect("...").await.unwrap();

let (state, layer) = Tx::setup(pool);

let app = axum::Router::new()
    // .route(...)s
    .layer(layer)
    .with_state(state);

然后,您可以将 [Tx] 简单地作为参数添加到您的处理程序中

type Tx = axum_sqlx_tx::Tx<sqlx::Sqlite>;

async fn create_user(mut tx: Tx, /* ... */) {
    // `&mut Tx` implements `sqlx::Executor`
    let user = sqlx::query("INSERT INTO users (...) VALUES (...)")
        .fetch_one(&mut tx)
        .await
        .unwrap();

    // `Tx` also implements `Deref<Target = sqlx::Transaction>` and `DerefMut`
    use sqlx::Acquire;
    let inner = tx.begin().await.unwrap();
    /* ... */
}

错误处理

axum 要求错误可以转换为响应。 Error 类型会转换为包含错误消息的响应体的 HTTP 500 响应。这可能适合开发或内部服务,但通常不建议向客户端返回内部错误详情。

有关如何自定义错误处理的说明,请参阅 Error

多个数据库

如果您需要与多个数据库一起工作,可以为每个数据库定义标记结构体。请参阅 Marker 中的示例。

目前无法使用 Tx 处理动态数量的数据库。如果您有这方面的需求,请随时提出问题。

访问池

请注意,State 实现了到内部 SQLx 池的 FromRef。因此,如果您在某些处理程序中仍然需要访问数据库池,您可以使用 axum 的 State 提取器。

use axum::extract::State;

async fn this_still_works(State(pool): State<sqlx::SqlitePool>) {
    /* ... */
}

示例

请参阅存储库中的 examples/ 以获取更多示例。

依赖项

~8–16MB
~212K SLoC