pgwire
为您的数据服务构建兼容 Postgres 的访问层。
该库实现了 PostgreSQL 线协议,并提供编写兼容 PostgreSQL 的服务器和客户端所需的基本 API。它类似于 hyper,但用于 postgres 线协议。
datafusion-postgres 项目是一个基于 pgwire 构建的更完整的库,以 datafusion 作为 查询引擎,并实现了基于 datafusion 的 pg_catalog。
如果您对相关主题感兴趣,可以查看 项目 想法 以基于 此库进行构建。
状态
-
消息格式
- 前端-后端协议消息
- 3.0
- 3.2, Postgres 18
- 流复制协议
- 逻辑流复制协议消息
- 前端-后端协议消息
-
基于 Tokio 的后端 TCP/TLS 服务器
-
基于 Tokio 的前端 TCP/TLS 客户端
-
前端-后端通过 TCP 进行交互
- SSL 请求和响应
- PostgreSQL 17 直接 SSL 协商
- GSSAPI 请求和响应:不支持 GSSAPI 加密
- 启动
- 协议协商
- 无身份验证
- 明文密码身份验证
- Md5 密码身份验证
- SASL SCRAM 身份验证
- SCRAM-SHA-256
- SCRAM-SHA-256-PLUS
- SASL OAUTH
- 简单查询和响应
- 扩展查询和响应
- 解析
- 绑定
- 执行
- 描述
- 同步
- 终止
- 取消
- 错误和通知
- 复制
- 通知
- SSL 请求和响应
-
通过 TCP 进行流复制
-
通过 TCP 进行逻辑流复制
-
数据类型
- 文本格式
- 二进制格式,已在
postgres-types中实现
-
API
- 后端/服务器
- 启动 API
- AuthSource API,用于获取和哈希密码
- 服务器参数 API,已就绪但不够完善
- 简单查询 API
- 扩展查询 API
- QueryParser API,用于转换预编译语句
- 结果集构建器/编码器 API
- 启动 API
- 后端/服务器
-
查询取消 API
- 错误和通知 API
- 复制 API
- 复制入
- 复制出
- 双向复制
- 事务状态
- 基于 TCP 的流式复制
- 逻辑流式复制服务器 API
- 前端/客户端
- 启动 API
- 简单查询 API
- 扩展查询 API
- 结果集解码器 API
- 查询取消 API
- 错误和通知 API
- 复制 API
- 事务状态
- 基于 TCP 的流式复制
- 逻辑流式复制服务器 API
关于 Postgres 线协议
Postgres 线协议是一种相对通用的第 7 层协议。该协议包含 6 个部分:
- 启动:客户端与服务器之间的握手和身份验证。
- 简单查询:postgresql 的基于文本的查询协议。查询以字符串形式提供,服务器允许以流式方式返回响应数据。
- 扩展查询:一种新的查询子协议,能够在服务器端缓存查询并使用新参数复用。响应部分与简单查询相同。
- 复制:用于从 postgresql 复制数据到 postgresql 的子协议。
- 复制
- 逻辑复制
另外请注意,Postgres 线协议不包含关于 SQL 的语义,因此从字面意义上讲,您可以使用任何查询语言、数据格式甚至自然语言与后端进行交互。
响应始终以数据行格式编码。并且数据头部包含字段描述,用于描述其名称、类型和格式。
Jelte Fennema-Nio 在 PgConf.dev 2024 上的演讲 对线协议的工作原理进行了很好的介绍: https://www.youtube.com/watch?v=nh62VgNj6hY
用法
服务器/后端
要在你的服务器应用程序中使用 pgwire,你需要实现两个关键
组件:startup processor 和 query processor。对于查询
处理,有两种类型的查询:simple 和 extended。通过向你的应用程序添加
SimpleQueryHandler,你将获得 psql 命令行工具
兼容性。而对于更多语言驱动程序以及额外的 prepared statement、
二进制编码支持,则需要 ExtendedQueryHandler。
提供了示例来演示 pgwire 在服务器端的最基本用法:
examples/sqlite.rs: 核心使用内存中的 sqlite 数据库,并通过 postgresql 协议提供服务。这是一个包含 simple 和 extended 查询实现的完整示例。cargo run --features _sqlite --example sqliteexamples/duckdb.rs: 现已移至 pgwire-duckdbexamples/gluesql.rs: 核心使用内存中的 gluesql,并通过 postgresql 协议提供服务。examples/server.rs: 演示一个始终返回固定结果的服务器。examples/secure_server.rs: 演示一个支持 ssl 且始终 返回固定结果的服务器。examples/scram.rs: 演示如何配置更安全的身份验证 机制: SCRAMexamples/transaction.rs: 查看如何在 wire 协议级别控制事务状态。examples/datafusion.rs: 现已移至 datafusion-postgresexamples/oauth.rs,examples/keycloak_oauth.rs: Postgres 18 OAuth 身份验证的示例。
Client/Frontend
客户端/前端 API 正在开发中。该 API 将专注于 提供对 postgres 线协议的完全访问。它旨在构建 类似 postgres 代理的组件。对于用于 应用程序开发的通用 postgres 驱动程序,您可以使用 rust-postgres。
使用 pgwire 的项目
- GreptimeDB:云原生 时序数据库
- risinglight:用于教育目的的 OLAP 数据库 系统
- PeerDB Postgres 优先的 ETL/ELT,实现 Postgres 数据进出速度提升 10 倍,已被 Clickhouse 收购
- CeresDB CeresDB 是蚂蚁集团的高性能、 分布式、云原生时序数据库。
- dozer 一个用于构建、部署和维护数据产品的实时数据平台。
- pg_catalog 为自定义数据库提供 postgres 兼容层。
- SpacetimeDB 面向多人游戏的数据库。它使用 pgwire 作为 postgres 协议接口。
- corrosion 来自 fly.io:基于 Gossip 的 大型分布式系统服务发现(及其他功能)。
- db9.ai:面向智能体的 Postgres。
如果您的项目未在此列出,请提交拉取请求。
社区
开发者邮件列表
如果您喜欢 pgwire 的理念并希望加入该库的开发, 或其生态集成、扩展,欢迎加入我们的 开发者邮件列表:https://groups.io/g/pgwire-dev/
Github 讨论
本仓库的 Github 讨论区也开放用于更多一般性问题。
许可证
本库以 MIT/Apache 双重许可证发布。