11 个版本 (4 个重大更改)

0.5.0 2024 年 4 月 11 日
0.4.4 2024 年 3 月 4 日
0.4.2 2024 年 2 月 7 日
0.3.1 2024 年 1 月 26 日
0.1.0 2024 年 1 月 8 日

#2387 in 数据库接口

Download history 13/week @ 2024-04-14 6/week @ 2024-04-21 13/week @ 2024-05-19 7/week @ 2024-05-26 8/week @ 2024-06-02 6/week @ 2024-06-09 1/week @ 2024-06-16 5/week @ 2024-06-23 6/week @ 2024-07-14 15/week @ 2024-07-21 69/week @ 2024-07-28

90 每月下载次数
2 crates 中使用

MIT/Apache

300KB
6.5K SLoC

simple_pg_client

正在进行中的项目,是 tokio-postgres 的分支,旨在与连接池和 SQL 查询构建器深度集成。

主要目标

  • 深度集成查询构建器。
  • 统一客户端类型,不再需要泛型客户端。由 implDeref<Conn> 替换。
  • 提供通过模式宇宙进行快速并行单元测试的方法。
  • 针对我们的用例优化性能。
  • 通过减少单态化来减少增量编译时间。

lib.rs:

一个异步、管道化、基于 tokio-postgres 的 PostgreSQL 客户端。

示例

use simple_pg_client::{NoTls, Error};

#[tokio::main] // By default, simple_pg_client uses the tokio crate as its runtime.
async fn main() -> Result<(), Error> {
    // Connect to the database.
    let (client, connection) =
        simple_pg_client::connect("host=localhost user=postgres", NoTls).await?;

    // The connection object performs the actual communication with the database,
    // so spawn it off to run on its own.
    tokio::spawn(async move {
        if let Err(e) = connection.await {
            eprintln!("connection error: {}", e);
        }
    });

    // Now we can execute a simple statement that just returns its parameter.
    let rows = client
        .query("SELECT $1::TEXT", &[&"hello world"])
        .await?;

    // And then check that we got back the same string we sent over.
    let value: &str = rows[0].get(0);
    assert_eq!(value, "hello world");

    Ok(())
}

行为

单独调用如 Client::query 方法不起作用。关联的请求不会发送到数据库,直到方法返回的 future 首次被轮询。请求按它们首次轮询的顺序执行,而不是按它们的 future 创建的顺序。

管道化

客户端支持 管道化 请求。在需要执行多个独立查询的场景中,管道化可以提高性能。在传统的流程中,每个查询都在前一个查询完成后发送到服务器。相比之下,管道化允许客户端事先将所有查询发送到服务器,最小化了一方等待另一方发送数据的时间。

            Sequential                              Pipelined
| Client         | Server          |    | Client         | Server          |
|----------------|-----------------|    |----------------|-----------------|
| send query 1   |                 |    | send query 1   |                 |
|                | process query 1 |    | send query 2   | process query 1 |
| receive rows 1 |                 |    | send query 3   | process query 2 |
| send query 2   |                 |    | receive rows 1 | process query 3 |
|                | process query 2 |    | receive rows 2 |                 |
| receive rows 2 |                 |    | receive rows 3 |                 |
| send query 3   |                 |
|                | process query 3 |
| receive rows 3 |                 |

在这两种情况下,PostgreSQL 服务器都是顺序执行查询的 - 管道化只是在可能的情况下允许连接的双方同时工作。

当 futures 并发轮询时,会自动发生管道化(例如,通过使用 futures 的 join 组合器)

use futures_util::future;
use std::future::Future;
use simple_pg_client::{Client, Error, Statement};

async fn pipelined_prepare(
    client: &Client,
) -> Result<(Statement, Statement), Error>
{
    future::try_join(
        client.prepare("SELECT * FROM foo"),
        client.prepare("INSERT INTO bar (id, name) VALUES ($1, $2)")
    ).await
}

运行时

客户端与任意 AsyncRead + AsyncWrite 流协同工作。提供了便捷的API来处理连接过程,但这些API受 runtime Cargo功能的控制,该功能默认启用。如果禁用,则删除对tokio运行时的所有依赖。

SSL/TLS支持

TLS支持通过外部库实现。 Client::connectConfig::connect 函数接受一个TLS实现作为参数。当不需要TLS时,可以使用此crate中的 NoTls 类型。否则,postgres-opensslpostgres-native-tls crate分别提供了基于 opensslnative-tls crate的实现。

功能

以下功能可以在 Cargo.toml 中启用

功能 描述 额外依赖项 默认
runtime 启用基于 tokio crate的连接过程的便捷API。 tokio 1.0,带有 nettime 功能 yes
array-impls 为数组启用 ToSqlFromSql 特性实现 - no
with-bit-vec-0_6 启用对 bit-vec crate的支持。 bit-vec 0.6 no
with-chrono-0_4 启用对 chrono crate的支持。 chrono 0.4 no
with-eui48-0_4 启用对 eui48 crate 0.4 版本的支持。这已被弃用,并将被移除。 eui48 0.4 no
with-eui48-1 启用对 eui48 crate 1.0 版本的支持。 eui48 1.0 no
with-geo-types-0_6 启用对 geo-types crate 0.6 版本的支持。 geo-types 0.6 no
with-geo-types-0_7 启用对 geo-types crate 0.7 版本的支持。 geo-types 0.7 no
with-serde_json-1 启用对 serde_json crate的支持。 serde_json 1.0 no
with-uuid-0_8 启用对 uuid crate的支持。 uuid 0.8 no
with-uuid-1 启用对 uuid crate的支持。 uuid 1.0 no
with-time-0_2 启用对 time crate 0.2 版本的支持。 time 0.2 no
with-time-0_3 启用对 time crate 0.3 版本的支持。 time 0.3 no

依赖项

~6–17MB
~236K SLoC