#连接池 #异步 ORM #查询构建器 #SQL 数据库 #ORM #异步 #SQL

diesel-async

为 Diesel 提供的异步扩展,Diesel 是一个安全、可扩展的 ORM 和查询构建器

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数据库接口

Download history 18921/week @ 2024-05-04 19988/week @ 2024-05-11 19554/week @ 2024-05-18 16054/week @ 2024-05-25 18766/week @ 2024-06-01 18131/week @ 2024-06-08 15249/week @ 2024-06-15 14898/week @ 2024-06-22 14124/week @ 2024-06-29 15479/week @ 2024-07-06 15241/week @ 2024-07-13 16435/week @ 2024-07-20 17549/week @ 2024-07-27 17142/week @ 2024-08-03 18511/week @ 2024-08-10 15342/week @ 2024-08-17

71,234 每月下载量
38 个 Crates 中使用 (23 个直接使用)

MIT/Apache 许可

225KB
3.5K SLoC

Diesel 的异步接口

Diesel 消除了数据库交互的样板代码,消除了运行时错误,同时没有牺牲性能。它充分利用 Rust 的类型系统,创建了一个低开销的查询构建器,感觉就像 Rust 一样。

Diesel-async 提供了 Diesel 连接实现和可能发出查询的任何方法的异步实现。它被设计为纯异步的插入式替换,用于相应的 diesel 方法。与 diesel 类似,该 crate 的设计允许第三方 crate 扩展现有基础设施,甚至提供自己的连接实现。

支持的数据库

  1. PostgreSQL
  2. 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.0许可证定义的,将根据上述条款双授权,不附加任何额外的条款或条件。

依赖关系

~3–18MB
~254K SLoC