pg_protobuf

提供Protobuf函数支持

概览

扩展包名版本分类许可证语言
pg_protobuf1.0UTILMITC
ID扩展名BinLibLoadCreateTrustReloc模式
4260pg_protobuf-
相关扩展pgjq pgqr gzip bzip zstd http pg_net pg_curl

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY1.01817161514pg_protobuf-
RPMPIGSTY1.01817161514pg_protobuf_$v-
DEBPIGSTY1.01817161514postgresql-$v-pg-protobuf-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d12.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
d13.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u22.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.x86_64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
u24.aarch64
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0
PIGSTY 1.0

构建

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

pig build pkg pg_protobuf         # 构建 RPM / DEB 包

安装

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

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

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

pig install pg_protobuf;          # 当前活跃 PG 版本安装
pig ext install -y pg_protobuf -v 18  # PG 18
pig ext install -y pg_protobuf -v 17  # PG 17
pig ext install -y pg_protobuf -v 16  # PG 16
pig ext install -y pg_protobuf -v 15  # PG 15
pig ext install -y pg_protobuf -v 14  # PG 14
dnf install -y pg_protobuf_18       # PG 18
dnf install -y pg_protobuf_17       # PG 17
dnf install -y pg_protobuf_16       # PG 16
dnf install -y pg_protobuf_15       # PG 15
dnf install -y pg_protobuf_14       # PG 14
apt install -y postgresql-18-pg-protobuf   # PG 18
apt install -y postgresql-17-pg-protobuf   # PG 17
apt install -y postgresql-16-pg-protobuf   # PG 16
apt install -y postgresql-15-pg-protobuf   # PG 15
apt install -y postgresql-14-pg-protobuf   # PG 14

创建扩展

CREATE EXTENSION pg_protobuf;

用法

pg_protobuf: PostgreSQL 的 Protocol Buffers 支持

提供无需 schema 定义即可在 SQL 中直接解码 Protocol Buffer 二进制数据的函数。

函数

  • protobuf_decode(bytea) RETURNS cstring – 将 protobuf 二进制数据解码为可读格式
  • protobuf_get_int(bytea, int) RETURNS bigint – 按字段编号提取整数字段
  • protobuf_get_string(bytea, int) RETURNS text – 按字段编号提取字符串字段
  • protobuf_get_bytes(bytea, int) RETURNS bytea – 按字段编号提取原始字节
  • protobuf_get_bool(bytea, int) RETURNS boolean – 按字段编号提取布尔字段
  • protobuf_get_float(bytea, int) RETURNS real – 按字段编号提取浮点字段
  • protobuf_get_double(bytea, int) RETURNS double precision – 按字段编号提取双精度字段
  • protobuf_get_sfixed32(bytea, int) RETURNS int – 提取有符号定长 32 位字段
  • protobuf_get_sfixed64(bytea, int) RETURNS bigint – 提取有符号定长 64 位字段
  • protobuf_get_int_multi(bytea, int) RETURNS bigint[] – 提取重复整数字段
  • protobuf_get_string_multi(bytea, int) RETURNS text[] – 提取重复字符串字段
  • protobuf_get_bytes_multi(bytea, int) RETURNS bytea[] – 提取重复字节字段
  • protobuf_get_bool_multi(bytea, int) RETURNS boolean[] – 提取重复布尔字段
  • protobuf_get_float_multi(bytea, int) RETURNS real[] – 提取重复浮点字段
  • protobuf_get_double_multi(bytea, int) RETURNS double precision[] – 提取重复双精度字段
  • protobuf_get_sfixed32_multi(bytea, int) RETURNS int[] – 提取重复 sfixed32 字段
  • protobuf_get_sfixed64_multi(bytea, int) RETURNS bigint[] – 提取重复 sfixed64 字段

示例

CREATE EXTENSION pg_protobuf;

-- 创建包含 protobuf 数据的表
CREATE TABLE heroes (x bytea);

-- 为特定字段定义访问函数
CREATE FUNCTION hero_name(x bytea) RETURNS text AS $$
BEGIN
  RETURN protobuf_get_string(x, 512);
END $$ LANGUAGE plpgsql IMMUTABLE;

CREATE FUNCTION hero_hp(x bytea) RETURNS bigint AS $$
BEGIN
  RETURN protobuf_get_int(x, 2);
END $$ LANGUAGE plpgsql IMMUTABLE;

-- 在 protobuf 字段上创建索引
CREATE INDEX hero_name_idx ON heroes USING btree(hero_name(x));

-- 按 protobuf 字段查询
SELECT hero_name(x) FROM heroes ORDER BY hero_name(x) LIMIT 10;

限制

  • 不支持修改 Protobuf 数据
  • 枚举值可通过 protobuf_get_int 读取
  • 不直接支持无符号类型(PostgreSQL 中没有无符号整数)
  • *_multi 函数不支持 [packed=true](可使用 protobuf_get_bytes* 替代)

最后修改 2026-03-14: update extension metadata (953cbd0)