37个版本 (23个重大更新)
0.24.1 | 2024年8月6日 |
---|---|
0.23.0 | 2024年6月14日 |
0.20.0 | 2024年3月17日 |
0.18.0 | 2023年12月23日 |
0.5.0 | 2022年11月12日 |
#96 在 数据库接口
每月8,877 次下载
用于 6 个Crates(4个直接使用)
195KB
4.5K SLoC
pgwire
为您的数据服务构建Postgres兼容的访问层。
此库实现了PostgreSQL线缆协议,并提供必要的API以编写兼容PostgreSQL的服务器和客户端。
此库仍在开发中,处于相对早期阶段。API的稳定性无法保证。在此期间,我不断引入重大更改。同时,对于API文档的不足表示歉意,示例可能使您熟悉其用法。
状态
- 消息格式
- 前端-后端协议消息
- 流式复制协议
- 逻辑流式复制协议消息
- 在Tokio上的后端TCP/TLS服务器
- TCP上的前端-后端交互
- SSL请求和响应
- 启动
- 无身份验证
- 明文密码身份验证
- Md5密码身份验证
- SASL SCRAM身份验证(可选功能
server-api-scram-ring
或server-api-scram-aws-lc-rs
)- SCRAM-SHA-256
- SCRAM-SHA-256-PLUS
- 简单查询和响应
- 扩展查询和响应
- 解析
- 绑定
- 执行
- 描述
- 同步
- 终止
- 取消
- 错误和通知
- 复制
- 通知
- TCP上的流式复制
- TCP上的逻辑流式复制
- 数据类型
- 文本格式
- 二进制格式,在
postgres-types
中实现
- API
- 启动API
- AuthSource API,获取和散列密码
- 服务器参数API,已就绪但不是很好
- 简单查询API
- 扩展查询API
- QueryParser API,用于转换预编译语句
- 结果集构建器/编码器API
- 查询取消API
- 错误和通知API
- 复制API
- 复制输入
- 复制输出
- 复制双向
- TCP上的流式复制
- 逻辑流式复制服务器API
- 启动API
关于Postgres线缆协议
Postgres线缆协议是一种相对通用目的的第七层协议。协议分为6个部分
- 启动:客户端-服务器握手和身份验证。
- 简单查询:postgresql的基于文本的查询协议。查询以字符串形式提供,服务器允许在响应中流式传输数据。
- 扩展查询:一种新的子协议,能够将查询在服务器端进行缓存,并使用新的参数重新使用。响应部分与简单查询相同。
- 复制:用于从和到postgresql复制数据的子协议。
- 复制
- 逻辑复制
请注意,Postgres Wire Protocol没有关于SQL的语义,因此您可以使用任何查询语言、数据格式甚至自然语言与后端交互。
响应总是以数据行格式编码。数据头部有字段描述,用于描述其名称、类型和格式。
Jelte Fennema-Nio在PgConf.dev 2024的演讲中详细介绍了Wire Protocol的工作原理:[观看视频](https://www.youtube.com/watch?v=nh62VgNj6hY)
用法
服务器/后端
要在您的服务器应用程序中使用pgwire
,您需要实现两个关键组件:启动处理器和查询处理器。对于查询处理,有两种类型的查询:简单和扩展。通过将SimpleQueryHandler
添加到您的应用程序中,您将获得psql
命令行工具兼容性。而对于更多语言驱动程序和额外的预编译语句、二进制编码支持,则需要ExtendedQueryHandler
。
下面提供了在服务器端使用pgwire
的基本用法的示例
examples/sqlite.rs
:使用内存中的sqlite数据库作为核心,并以postgresql协议提供服务。这是一个包含简单和扩展查询实现的完整示例。examples/duckdb.rs
:与sqlite示例类似,但使用duckdb后端。请注意,此示例中未实现所有数据类型。examples/gluesql.rs
:使用内存中的gluesql作为核心,并以postgresql协议提供服务。examples/server.rs
:演示了一个始终返回固定结果的服务器。examples/secure_server.rs
:演示了一个具有SSL支持并始终返回固定结果的服务器。examples/scram.rs
:演示了如何配置更安全的认证机制:SCRAMexamples/datafusion.rs
:现在已移至datafusion-postgres
客户端/前端
我认为在大多数情况下,您不需要pgwire来构建postgresql客户端,现有的postgresql客户端(如rust-postgres)应该适合您的场景。如果有场景,请提出问题。
使用pgwire的项目
- GreptimeDB:云原生时间序列数据库
- risinglight:用于教育目的的OLAP数据库系统
- PeerDB:Postgres第一个ETL/ELT,实现数据在Postgres中进出的10倍速度
- CeresDB:CeresDB是来自AntGroup的高性能、分布式、云原生时间序列数据库。
- dozer:用于构建、部署和维护数据产品的实时数据平台。
许可证
此库采用MIT/Apache双许可证发布。
依赖项
~0.4–20MB
~378K SLoC