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 数据库接口
90 每月下载次数
在 2 crates 中使用
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::connect
和 Config::connect
函数接受一个TLS实现作为参数。当不需要TLS时,可以使用此crate中的 NoTls
类型。否则,postgres-openssl
和 postgres-native-tls
crate分别提供了基于 openssl
和 native-tls
crate的实现。
功能
以下功能可以在 Cargo.toml
中启用
功能 | 描述 | 额外依赖项 | 默认 |
---|---|---|---|
runtime |
启用基于 tokio crate的连接过程的便捷API。 |
tokio 1.0,带有 net 和 time 功能 |
yes |
array-impls |
为数组启用 ToSql 和 FromSql 特性实现 |
- | 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