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

Download history 1144/week @ 2024-05-03 2181/week @ 2024-05-10 2084/week @ 2024-05-17 2366/week @ 2024-05-24 3424/week @ 2024-05-31 2922/week @ 2024-06-07 3578/week @ 2024-06-14 3273/week @ 2024-06-21 1868/week @ 2024-06-28 2187/week @ 2024-07-05 1703/week @ 2024-07-12 2173/week @ 2024-07-19 1969/week @ 2024-07-26 2390/week @ 2024-08-02 2456/week @ 2024-08-09 1692/week @ 2024-08-16

每月8,877 次下载
用于 6 个Crates(4个直接使用)

MIT/Apache

195KB
4.5K SLoC

pgwire

CI Docs

为您的数据服务构建Postgres兼容的访问层。

此库实现了PostgreSQL线缆协议,并提供必要的API以编写兼容PostgreSQL的服务器和客户端。

此库仍在开发中,处于相对早期阶段。API的稳定性无法保证。在此期间,我不断引入重大更改。同时,对于API文档的不足表示歉意,示例可能使您熟悉其用法。

状态

  • 消息格式
    • 前端-后端协议消息
    • 流式复制协议
    • 逻辑流式复制协议消息
  • 在Tokio上的后端TCP/TLS服务器
  • TCP上的前端-后端交互
    • SSL请求和响应
    • 启动
      • 无身份验证
      • 明文密码身份验证
      • Md5密码身份验证
      • SASL SCRAM身份验证(可选功能 server-api-scram-ringserver-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

关于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:演示了如何配置更安全的认证机制:SCRAM
  • examples/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