pgproto

原生 Protobuf 解析、修改、索引与 JSON 转换支持

概览

扩展包名版本分类许可证语言
pgproto0.2.1UTILPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
4130pgproto-
相关扩展pg_protobuf pg_jsonschema pg_csv

Extension SQL default_version is 1.0 while the packaged upstream release version is 0.2.1.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.2.11817161514pgproto-
RPMPIGSTY0.2.11817161514pgproto_$v-
DEBPIGSTY0.2.11817161514postgresql-$v-pgproto-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
PIGSTY 0.2.1
PIGSTY 0.2.1
PIGSTY 0.2.1
PIGSTY 0.2.1
PIGSTY 0.2.1
u24.x86_64
u24.aarch64
PIGSTY 0.2.1
PIGSTY 0.2.1
PIGSTY 0.2.1
PIGSTY 0.2.1
PIGSTY 0.2.1

构建

您可以使用 pig build 命令构建 pgproto 扩展的 RPM / DEB 包:

pig build pkg pgproto         # 构建 RPM / DEB 包

安装

您可以直接安装 pgproto 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pgproto;          # 当前活跃 PG 版本安装
pig ext install -y pgproto -v 18  # PG 18
pig ext install -y pgproto -v 17  # PG 17
pig ext install -y pgproto -v 16  # PG 16
pig ext install -y pgproto -v 15  # PG 15
pig ext install -y pgproto -v 14  # PG 14
dnf install -y pgproto_18       # PG 18
dnf install -y pgproto_17       # PG 17
dnf install -y pgproto_16       # PG 16
dnf install -y pgproto_15       # PG 15
dnf install -y pgproto_14       # PG 14
apt install -y postgresql-18-pgproto   # PG 18
apt install -y postgresql-17-pgproto   # PG 17
apt install -y postgresql-16-pgproto   # PG 16
apt install -y postgresql-15-pgproto   # PG 15
apt install -y postgresql-14-pgproto   # PG 14

创建扩展

CREATE EXTENSION pgproto;

用法

语法:

CREATE EXTENSION pgproto;
INSERT INTO pb_schemas (name, data) VALUES ('MySchema', '\x...');
CREATE TABLE items (id serial PRIMARY KEY, data protobuf);
SELECT data #> '{Outer, inner, id}'::text[] FROM items;

来源:README

pgproto 为 PostgreSQL 增加了原生 Protocol Buffers 支持。它提供 protobuf 类型、运行时 schema 注册、嵌套字段提取、更新辅助函数,以及面向 protobuf 载荷的索引支持。

配置

启用扩展:

CREATE EXTENSION pgproto;

通过加载 FileDescriptorSet blob 注册 protobuf schema:

INSERT INTO pb_schemas (name, data) VALUES ('MySchema', '\x...');

使用自定义 protobuf 类型创建表:

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    data protobuf
);

查询

README 强调可以用 PostgreSQL 风格的操作符进行嵌套字段提取:

SELECT data #> '{Outer, inner, id}'::text[] FROM items;
SELECT data #> '{Outer, tags, mykey}'::text[] FROM items;

它还提到 ->#> 等自定义操作符可用于按 schema 进行导航。

修改函数

pgproto 提供若干纯函数,会返回一个新的 protobuf 值:

  • pb_set(...)
  • pb_insert(...)
  • pb_delete(...)

由于它们返回的是修改后的值,而不是原地变更,因此通常会在 UPDATE 语句中使用:

UPDATE items SET data = pb_set(data, ARRAY['Outer', 'a'], '42');
UPDATE items SET data = pb_insert(data, ARRAY['Outer', 'scores', '0'], '100');
UPDATE items SET data = pb_delete(data, ARRAY['Outer', 'a']);

|| 操作符用于合并两个同类型的 protobuf 消息。

索引

README 记录了对提取字段做 B-tree 表达式索引的方法:

CREATE INDEX idx_pb_id ON items ((data #> '{Outer, inner, id}'::text[]));

项目还宣称支持 GIN 索引以服务查询场景。

说明

上游 README 将 pgproto 定位为比 JSONB 更节省存储空间的 protobuf 原生载荷方案,并强调 protobuf schema 演进、枚举、oneof 以及 map/repeated 字段访问都可支持。


最后修改 2026-04-10: extension update (13b4540)