11 个版本
0.5.0 | 2024 年 7 月 19 日 |
---|---|
0.4.1 | 2023 年 9 月 1 日 |
0.3.2 | 2023 年 7 月 24 日 |
0.2.1 | 2023 年 3 月 8 日 |
0.1.1 | 2022 年 10 月 19 日 |
#20 在 数据库接口 中
71,234 每月下载量
在 38 个 Crates 中使用 (23 个直接使用)
225KB
3.5K SLoC
Diesel 的异步接口
Diesel 消除了数据库交互的样板代码,消除了运行时错误,同时没有牺牲性能。它充分利用 Rust 的类型系统,创建了一个低开销的查询构建器,感觉就像 Rust 一样。
Diesel-async 提供了 Diesel 连接实现和可能发出查询的任何方法的异步实现。它被设计为纯异步的插入式替换,用于相应的 diesel 方法。与 diesel 类似,该 crate 的设计允许第三方 crate 扩展现有基础设施,甚至提供自己的连接实现。
支持的数据库
- PostgreSQL
- MySQL
用法
简单用法
Diesel-async 是为了与 diesel 一起工作而设计的,而不是替换 diesel。为此,它提供了对与数据库实际交互的 diesel 功能的插入式替换。
一个正常的项目应该使用以下类似的设置
[dependencies]
diesel = "2.1.0" # no backend features need to be enabled
diesel-async = { version = "0.3.1", features = ["postgres"] }
这允许从两个 crate 中导入相关的 trait
use diesel::prelude::*;
use diesel_async::{RunQueryDsl, AsyncConnection, AsyncPgConnection};
// ordinary diesel model setup
table! {
users {
id -> Integer,
name -> Text,
}
}
#[derive(Queryable, Selectable)]
#[diesel(table_name = users)]
struct User {
id: i32,
name: String,
}
// create an async connection
let mut connection = AsyncPgConnection::establish(&std::env::var("DATABASE_URL")?).await?;
// use ordinary diesel query dsl to construct your query
let data: Vec<User> = users::table
.filter(users::id.gt(0))
.or_filter(users::name.like("%Luke"))
.select(User::as_select())
// execute the query via the provided
// async `diesel_async::RunQueryDsl`
.load(&mut connection)
.await?;
异步事务支持
Diesel-async 提供了一个便捷的接口,将多个语句包装在一个共享的数据库事务中。一旦内部闭包返回错误,此类事务就会自动回滚。
connection.transaction::<_, diesel::result::Error, _>(|conn| async move {
diesel::insert_into(users::table)
.values(users::name.eq("Ruby"))
.execute(conn)
.await?;
let all_names = users::table.select(users::name).load::<String>(conn).await?;
Ok(())
}.scope_boxed()
).await?;
流式查询支持
除了将数据直接加载到向量中之外,diesel-async 还支持为每个查询返回一个值流。这允许在接收数据的同时处理数据库中的数据。
// use ordinary diesel query dsl to construct your query
let data: impl Stream<Item = QueryResult<User>> = users::table
.filter(users::id.gt(0))
.or_filter(users::name.like("%Luke"))
.select(User::as_select())
// execute the query via the provided
// async `diesel_async::RunQueryDsl`
.load_stream(&mut connection)
.await?;
内置连接池支持
Diesel-async 提供了对多个连接池 crate 的内置支持。这包括对以下的支持:
Deadpool
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
use diesel_async::pooled_connection::deadpool::Pool;
use diesel_async::RunQueryDsl;
// create a new connection pool with the default config
let config = AsyncDieselConnectionManager::<diesel_async::AsyncPgConnection>::new(std::env::var("DATABASE_URL")?);
let pool = Pool::builder(config).build()?;
// checkout a connection from the pool
let mut conn = pool.get().await?;
// use the connection as ordinary diesel-async connection
let res = users::table.select(User::as_select()).load::(&mut conn).await?;
BB8
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
use diesel_async::pooled_connection::bb8::Pool;
use diesel_async::RunQueryDsl;
// create a new connection pool with the default config
let config = AsyncDieselConnectionManager::<diesel_async::AsyncPgConnection>::new(std::env::var("DATABASE_URL")?);
let pool = Pool::builder().build(config).await?;
// checkout a connection from the pool
let mut conn = pool.get().await?;
// use the connection as ordinary diesel-async connection
let res = users::table.select(User::as_select()).load::(&mut conn).await?;
Mobc
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
use diesel_async::pooled_connection::mobc::Pool;
use diesel_async::RunQueryDsl;
// create a new connection pool with the default config
let config = AsyncDieselConnectionManager::<diesel_async::AsyncPgConnection>::new(std::env::var("DATABASE_URL")?);
let pool = Pool::new(config);
// checkout a connection from the pool
let mut conn = pool.get().await?;
// use the connection as ordinary diesel-async connection
let res = users::table.select(User::as_select()).load::(&mut conn).await?;
与安全数据库结合使用的 Diesel-Async
在使用此crate的sslmode=require
标志时,将需要构建一个TLS证书。在postgres
示例文件夹中提供了一个使用rustls
crate构建TLS证书的示例。
crate功能标志
Diesel-async提供了一些可配置的功能
postgres
:启用AsyncPgConnection
的实现mysql
:启用AsyncMysqlConnection
的实现deadpool
:启用对deadpool
连接池实现的支持bb8
:启用对bb8
连接池实现的支持mobc
:启用对mobc
连接池实现的支持
默认情况下,没有启用任何功能。
行为准则
任何与Diesel在任何空间(包括但不限于此GitHub存储库)互动的人都必须遵守我们的行为准则。
许可证
根据以下任一许可证授权
- Apache许可证第2版(LICENSE-APACHE或https://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或https://opensource.org/licenses/MIT)
贡献
贡献是明确欢迎的。请首先考虑打开一个讨论,以讨论可能的设计。
除非您明确声明,否则您提交的任何贡献,根据Apache-2.0许可证定义的,将根据上述条款双授权,不附加任何额外的条款或条件。
依赖关系
~3–18MB
~254K SLoC