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
每月下载量 288
在 aide-axum-sqlx-tx 中使用
31KB
441 行
axum-sqlx-tx
axum 的请求范围 SQLx 事务。
摘要
axum-sqlx-tx
提供了一个 axum
提取器,用于获取请求范围的事务。事务在提取器第一次被使用时开始,并存储在请求中以供其他中间件/处理器使用。根据响应的状态码来解析事务 - 成功(2XX
)的响应将提交事务,否则将回滚。
有关更多信息和使用示例,请参阅 工具包文档。
lib.rs
:
axum 的请求范围 SQLx 事务。
[Tx
] 是一个 axum
提取器,用于获取绑定到 HTTP 请求的事务。事务在提取器第一次用于请求时开始,然后存储在 请求扩展 中,供其他中间件/处理器使用。事务的解析取决于最终响应的状态码 - 成功(HTTP 2XX
或 3XX
)的响应将导致提交事务,否则将回滚。
这种行为通常是合理的默认行为,使用提取器(例如,而不是直接使用 sqlx::Transaction
)意味着您不会忘记提交事务!
使用方法
要使用 [Tx
] 提取器,您首先需要将 State
和 Layer
添加到您的应用程序中。 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