pg_net

用 SQL 进行异步非阻塞HTTP/HTTPS 请求的扩展 (supabase)

概览

扩展包名版本分类许可证语言
pg_net0.20.3UTILApache-2.0C
ID扩展名BinLibLoadCreateTrustReloc模式
4080pg_netnet
相关扩展http pg_curl pgjwt pg_smtp_client gzip bzip zstd pgjq
下游依赖pgmb

0.20.3 on d12/d13/el10/u24/u26; el8/el9/u22 remain on 0.9.2 due older libcurl.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.20.31817161514pg_net-
RPMPIGSTY0.20.31817161514pg_net_$v-
DEBPIGSTY0.20.31817161514postgresql-$v-pg-net-
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.9.2
PIGSTY 0.9.2
PIGSTY 0.9.2
PIGSTY 0.9.2
PIGSTY 0.9.2
u24.x86_64
u24.aarch64
PIGSTY 0.20.3
PIGSTY 0.20.3
PIGSTY 0.20.3
PIGSTY 0.20.3
PIGSTY 0.20.3
u26.x86_64
u26.aarch64

构建

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

pig build pkg pg_net         # 构建 RPM / DEB 包

安装

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

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

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

pig install pg_net;          # 当前活跃 PG 版本安装
pig ext install -y pg_net -v 18  # PG 18
pig ext install -y pg_net -v 17  # PG 17
pig ext install -y pg_net -v 16  # PG 16
pig ext install -y pg_net -v 15  # PG 15
pig ext install -y pg_net -v 14  # PG 14
dnf install -y pg_net_18       # PG 18
dnf install -y pg_net_17       # PG 17
dnf install -y pg_net_16       # PG 16
dnf install -y pg_net_15       # PG 15
dnf install -y pg_net_14       # PG 14
apt install -y postgresql-18-pg-net   # PG 18
apt install -y postgresql-17-pg-net   # PG 17
apt install -y postgresql-16-pg-net   # PG 16
apt install -y postgresql-15-pg-net   # PG 15
apt install -y postgresql-14-pg-net   # PG 14

预加载配置

shared_preload_libraries = 'pg_net';

创建扩展

CREATE EXTENSION pg_net;

用法

来源:official READMEv0.20.3 release noteslocal package metadata

pg_net 可以从 SQL 中排队发起异步 HTTP 和 HTTPS 请求。它会创建 net 模式,将待处理工作存入 net.http_request_queue,并将响应存入 net._http_response。后台工作进程使用 libcurl 处理队列中的请求。

该扩展要求配置 shared_preload_libraries = 'pg_net',并需要 libcurl >= 7.83

GET 请求

CREATE EXTENSION pg_net;

SELECT net.http_get(
  'https://postman-echo.com/get',
  params := '{"foo": "bar"}'::jsonb,
  headers := '{"API-KEY": "<key>"}'::jsonb,
  timeout_milliseconds := 1000
) AS request_id;

net.http_get(url, params, headers, timeout_milliseconds) 返回一个 bigint 请求 ID。

POST 请求

SELECT net.http_post(
  'https://postman-echo.com/post',
  body := '{"key": "value"}'::jsonb,
  headers := '{"Content-Type": "application/json"}'::jsonb,
  timeout_milliseconds := 1000
) AS request_id;

将一行表数据作为 JSON 发送:

WITH selected_row AS (
  SELECT * FROM my_table LIMIT 1
)
SELECT net.http_post(
  'https://api.example.com/data',
  to_jsonb(selected_row.*)
) AS request_id
FROM selected_row;

DELETE 请求

SELECT net.http_delete(
  'https://api.example.com/resource/42',
  timeout_milliseconds := 2000
) AS request_id;

net.http_delete(url, params, headers, timeout_milliseconds)SECURITY DEFINER,并返回一个 bigint 请求 ID。

查看响应

SELECT id, status_code, content, error_msg, created
FROM net._http_response
ORDER BY created DESC;

可以通过 status_codeerror_msg 识别失败请求。响应表不会保留所有原始请求参数;如果需要实现重试工作流,请单独保存请求元数据。

配置

SHOW pg_net.batch_size;
SHOW pg_net.ttl;
SHOW pg_net.database_name;
SHOW pg_net.username;
  • pg_net.batch_size 默认值为 200,限制工作进程每轮处理的队列请求数量。
  • pg_net.ttl 默认值为 6 hours,控制响应保留时间。
  • pg_net.database_name 默认值为 postgres,选择工作进程运行所在数据库。
  • pg_net.username 默认值为 NULL,选择工作进程连接用户;NULL 表示使用引导用户。

可以在 postgresql.conf 中修改设置,也可以使用 ALTER SYSTEM

ALTER SYSTEM SET pg_net.ttl TO '1 hour';
ALTER SYSTEM SET pg_net.batch_size TO 500;
SELECT pg_reload_conf();

修改 pg_net.database_namepg_net.username 后,需要重启工作进程:

SELECT net.worker_restart();

注意事项

  • Pigsty 元数据记录 PostgreSQL 14-18 的 pg_net 版本为 0.20.3,但本地包备注说明 0.20.3 只在 d12d13el10u24u26 上可用;由于旧版 libcurlel8el9u22 仍停留在 0.9.2。
  • 上游文档声明兼容 PostgreSQL 12+,但此目录行面向 PostgreSQL 14-18 打包。
  • pg_net 通过 pg_net.database_name 在每个集群中只支持一个数据库。
  • v0.20.3 是工作进程/维护发布:它会刷新 pgstat 计数器以便 autovacuum 可见,并向 pg_stat_activity 报告工作进程活动;没有记录新的 SQL 请求 API。

最后修改 2026-07-02: extension update 2026-07-02 (d4da20c)