pgproto
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pgproto | 0.2.1 | UTIL | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 4130 | pgproto | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 相关扩展 | pg_protobuf pg_jsonschema pg_csv |
|---|
Extension SQL default_version is 1.0 while the packaged upstream release version is 0.2.1.
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 0.2.1 | 1817161514 | pgproto | - |
| RPM | PIGSTY | 0.2.1 | 1817161514 | pgproto_$v | - |
| DEB | PIGSTY | 0.2.1 | 1817161514 | postgresql-$v-pgproto | - |
构建
您可以使用 pig build 命令构建 pgproto 扩展的 RPM / DEB 包:
pig build pkg pgproto # 构建 RPM / DEB 包
安装
您可以直接安装 pgproto 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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 字段访问都可支持。