postgresql的扩展:pg_net

pg_net使 PostgreSQL 能够在 SQL 中发出异步 HTTP/HTTPS 请求。它不同于[http]扩展,因为它默认是异步的。这使得它在阻塞函数(如触发器)中很有用。

它消除了服务器不断轮询数据库更改的需要,而是允许数据库主动通知外部资源有关重大事件的信息。

1.介绍

PG_NET扩展使 PostgreSQL 能够在 SQL 中发出异步 HTTP/HTTPS 请求。它消除了服务器不断轮询数据库更改的需要,而是允许数据库主动通知外部资源有关重大事件的信息。它与触发器、cron 作业(例如PG_CRON)和程序无缝集成,解锁了无数可能性。值得注意的是,PG_NET为 Supabase 的 Webhook 功能提供支持,突出了其健壮性和可靠性。

PG_NET扩展的常见用例包括:

  • 调用外部 API
  • 与外部资源同步数据
  • 在发生事件(如插入)时调用无服务器函数

但是,需要注意的是,该扩展有一些限制。目前,它仅支持三种类型的异步请求:

  • 异步 http GET 请求
  • 具有 JSON 有效负载的异步 http POST 请求
  • 异步 http DELETE 请求

不过,最终,PG_NET为开发人员提供了更大的灵活性,使他们能够监控数据库并将其与外部资源连接起来。

1.1.技术说明

该扩展引入了一个新架构,其中包含两个未记录的表,这是 PostgreSQL 中的一种表,它以牺牲持久性为代价来提供性能改进。您可以在此处阅读有关未记录表的更多信息。这两个表是:net

  1. http_request_queue:此表用作等待执行的请求的队列。成功执行请求后,相应的数据将从队列中删除。

    用于创建此表的 SQL 语句为:

    CREATE UNLOGGED TABLEnet.http_request_queue (id bigint NOT NULL DEFAULT nextval('net.http_request_queue_id_seq'::regclass),method text NOT NULL,url text NOT NULL,headers jsonb NOT NULL,body bytea NULL,timeout_milliseconds integer NOT NULL)
    
  2. _http_response:此表包含每个已执行请求的响应。

    用于创建此表的 SQL 语句为:

    CREATE UNLOGGED TABLEnet._http_response (id bigint NULL,status_code integer NULL,content_type text NULL,headers jsonb NULL,content text NULL,timed_out boolean NULL,error_msg text NULL,created timestamp with time zone NOT NULL DEFAULT now())
    

当调用三个请求函数 (, , ) 中的任何一个时,它们都会在表中创建一个条目。http_get``http_post``http_delete``net.http_request_queue

2.安装和使用

2.1. 安装

下载资源:Releases · supabase/pg_net (github.com)

![[pg_net安装资源.png]]

make && make install

要使扩展可用于数据库,请添加:postgresql.conf

shared_preload_libraries = 'pg_net'

在 PostgreSQL 中安装

要在 PostgreSQL 中激活扩展,请运行 create extension 命令。该扩展创建自己的名为 net 的架构,以避免命名冲突。

create extension pg_net;

2.2.配置

该扩展创建 3 个可配置变量:

  1. pg_net.batch_size_(默认值:200):_一个整数,用于限制扩展在每次读取期间从 net.http_request_queue 处理的最大行数
  2. pg_net.ttl_(默认值:6 小时):定义net.http_response_中行在被删除之前的最长时间间隔
  3. pg_net.database_name(默认值:‘postgres’):定义扩展应用于哪个数据库的字符串

可以使用以下命令查看所有这些变量:

show pg_net.batch_size;
show pg_net.ttl;
show pg_net.database_name;

您可以通过编辑文件(使用 )或使用以下命令来更改这些内容:postgresql.conf``SHOW config_file;``ALTER SYSTEM

alter system set pg_net.ttl to '1 hour'
alter system set pg_net.batch_size to 500;

然后,重新加载设置并使用以下命令重新启动后台辅助角色:pg_net

select net.worker_restart();

请注意,这样做需要 SUPERUSER,但在 PostgreSQL >= 15 上,您可以执行以下操作:ALTER SYSTEM

grant alter system on parameter pg_net.ttl to <role>;
grant alter system on parameter pg_net.batch_size to <role>;

允许普通用户更新设置。pg_net

2.3.使用API说明

2.3.1.GET请求

2.3.1.1. net.http_get函数签名
net.http_get(-- url for the requesturl text,-- key/value pairs to be url encoded and appended to the `url`params jsonb default '{}'::jsonb,-- key/values to be included in request headersheaders jsonb default '{}'::jsonb,-- the maximum number of milliseconds the request may take before being cancelledtimeout_milliseconds int default 1000
)-- request_id referencereturns bigintstrictvolatileparallel safelanguage plpgsql
2.3.1.2. 函数具体使用
  • 调用API
SELECT net.http_get ('https://postman-echo.com/get?foo1=bar1&foo2=bar2'
) AS request_id;
  • 使用 URL 编码的参数调用 API
SELECT net.http_get('https://postman-echo.com/get',-- Equivalent to calling https://postman-echo.com/get?foo1=bar1&foo2=bar2&encoded=%21-- The "!" is url-encoded as %21'{"foo1": "bar1", "foo2": "bar2", "encoded": "!"}'::JSONB
) AS request_id;
  • 使用 API-KEY 调用 API
SELECT net.http_get('https://postman-echo.com/get?foo1=bar1&foo2=bar2',headers := '{"API-KEY-HEADER": "<API KEY>"}'::JSONB
) AS request_id;

2.3.2. POST 请求

2.3.2.1. net.http_post函数签名
net.http_post(-- url for the requesturl text,-- body of the POST requestbody jsonb default '{}'::jsonb,-- key/value pairs to be url encoded and appended to the `url`params jsonb default '{}'::jsonb,-- key/values to be included in request headersheaders jsonb default '{"Content-Type": "application/json"}'::jsonb,-- the maximum number of milliseconds the request may take before being cancelledtimeout_milliseconds int default 1000
)-- request_id referencereturns bigintvolatileparallel safelanguage plpgsql
2.3.2.2.函数具体使用
  • 向 API 发送数据
SELECT net.http_post('https://postman-echo.com/post','{"key": "value", "key": 5}'::JSONB,headers := '{"API-KEY-HEADER": "<API KEY>"}'::JSONB
) AS request_id;
  • 将单个表行作为有效负载发送

注意:如果使用此方法发送多行,则每行将作为单独的请求发送。

WITH selected_row AS (SELECT*FROM target_tableLIMIT 1
)
SELECTnet.http_post('https://postman-echo.com/post',to_jsonb(selected_row.*),headers := '{"API-KEY-HEADER": "<API KEY>"}'::JSONB) AS request_id
FROM selected_row;
  • 将多个表行作为有效负载发送

警告:发送多行时,请注意限制有效负载大小。

WITH selected_rows AS (SELECT-- Converts all the rows into a JSONB arrayjsonb_agg(to_jsonb(target_table)) AS JSON_payloadFROM target_table-- Generally good practice to LIMIT the max amount of rows
)
SELECTnet.http_post('https://postman-echo.com/post'::TEXT,JSON_payload,headers := '{"API-KEY-HEADER": "<API KEY>"}'::JSONB) AS request_id
FROM selected_rows;

2.3.3. DELETE 请求

2.3.3.1. net.http_delete函数签名
net.http_delete(-- url for the requesturl text,-- key/value pairs to be url encoded and appended to the `url`params jsonb default '{}'::jsonb,-- key/values to be included in request headersheaders jsonb default '{}'::jsonb,-- the maximum number of milliseconds the request may take before being cancelledtimeout_milliseconds int default 2000
)-- request_id referencereturns bigintstrictvolatileparallel safelanguage plpgsqlsecurity definer
2.3.3.2.函数具体使用

以下示例使用虚拟 Rest API。

  • 向 API 发送删除请求
SELECT net.http_delete('https://dummy.restapiexample.com/api/v1/delete/2'
) AS request_id;
  • 发送将行 ID 作为查询参数的删除请求
WITH selected_id AS (SELECTidFROM target_tableLIMIT 1 -- if not limited, it will make a delete request for each returned row
)
SELECTnet.http_delete('https://dummy.restapiexample.com/api/v1/delete/'::TEXT,format('{"id": "%s"}', id)::JSONB) AS request_id
FROM selected_id;
  • 发送以行 ID 作为路径参数的删除请求
WITH selected_id AS (SELECTidFROM target_tableLIMIT 1 -- if not limited, it will make a delete request for each returned row
)
SELECTnet.http_delete('https://dummy.restapiexample.com/api/v1/delete/' || id) AS request_id
FROM selected_row

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676284.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(四)elasticsearch 源码之索引流程分析

https://www.cnblogs.com/darcy-yuan/p/17024341.html 1.概览 前面我们讨论了es是如何启动&#xff0c;本文研究下es是如何索引文档的。 下面是启动流程图&#xff0c;我们按照流程图的顺序依次描述。 其中主要类的关系如下: 2. 索引流程 (primary) 我们用postman发送请求&…

Windows Server 2025 Hyper-V 新变化

今天简单跟大家聊聊Windows Server 2025 Hyper-V一些新功能新变化&#xff0c;具体如下&#xff1a; 在 VM 之间共享 GPU 随着图形处理器的重要性日益增加&#xff0c;特别是由于它们在 AI 应用程序中的核心作用&#xff0c;Hyper-V 中对 GPU 的现有支持已不再足够。到目前为…

[Java][算法 哈希]Day 01---LeetCode 热题 100---01~03

LeetCode 热题 100---01~03 ------->哈希 第一题 两数之和 思路 最直接的理解就是 找出两个数的和等于目标数 这两个数可以相同 但是不能是同一个数字&#xff08;从数组上理解就是内存上不是同一位置&#xff09; 解法一&#xff1a;暴力法 暴力解万物 按照需求 …

报错ValueError: Unknown CUDA arch (8.6) or GPU not supported

文章目录 问题描述解决方案参考文献 问题描述 报错 ValueError: Unknown CUDA arch (8.6) or GPU not supported 本人显卡为 RTX 3060&#xff0c;CUDA 为 10.2&#xff0c;PyTorch 为 1.5 解决方案 修改 C:\Users\Administrator\Envs\test\Lib\site-packages\torch\utils\c…

20 TemplateMethod模板方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、解释二、代码实现1.Java2.GoLang 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、解释 凡是重写系统自动调用的某些功能&…

【PyQt】08 - 编辑Tab顺序

文章目录 前言一、Tab顺序二、编辑Tab顺序总结 前言 介绍了什么是Tab顺序&#xff0c;以及如何修改Tab顺序。 一、Tab顺序 当你的界面设计好之后&#xff0c;在输入栏按住Tab按键&#xff0c;他会按照你摆放的顺序一次转跳 二、编辑Tab顺序 方法一 然后鼠标左击就可以改变…

前端JavaScript篇之对this对象的理解

目录 对this对象的理解1. 函数调用模式&#xff1a;2. 方法调用模式&#xff1a;3. 构造器调用模式&#xff1a;4. apply、call和bind调用模式&#xff1a; 对this对象的理解 在JavaScript中&#xff0c;this关键字是一个非常重要的概念&#xff0c;它用于指向当前执行上下文中…

【CV论文精读】EarlyBird: Early-Fusion for Multi-View Tracking in the Bird’s Eye View

【CV论文精读】EarlyBird: Early-Fusion for Multi-View Tracking in the Bird’s Eye View 0.论文摘要 多视图聚合有望克服多目标检测和跟踪中的遮挡和漏检挑战。多视图检测和3D对象检测中的最新方法通过将所有视图投影到地平面并在鸟瞰视图&#xff08;BEV&#xff09;中执…

面试经典150题 -- 栈(总结)

总的链接 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 关于栈 -- stack 的学习链接 c的STL中的栈 -- stack-CSDN博客 20 . 有效的括号 这题直接用栈模拟就好了; 这里用一种取巧的方法 , 当遇见左括号&#xff0c;加入右…

JAVA设计模式之建造者模式详解

建造者模式 1 建造者模式介绍 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式. 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 **建造者模式要解决的问题 ** 建造者模式可以将部件和其组装过程分开…

三丰云免费云服务器测评

三丰云是一家提供免费服务器和虚拟主机的服务商&#xff0c;它的目标是为学生和初创业者提供永久免费的云计算资源。但是&#xff0c;这种免费的服务是否值得使用呢&#xff1f;本文将从以下几个方面对三丰云免费云服务器进行评测&#xff1a; - 申请流程&#xff1a;要使用三丰…

Dynamo批量处理多个Revit文件?

Hello大家好&#xff01;我是九哥~ 最近很多小伙伴都在咨询Dynamo如何批量处理多个Revit文件&#xff0c;之前写过一篇《Dynamo批量修改多文件项目基点参数》&#xff0c;利用的是后台打开Revit的方式&#xff0c;可以实现一些批量操作的功能。 但是这个方法&#xff0c;对于一…

vue-cil组件引用

这段子组件代码是一个使用Vue 3 及其新特性 <script setup> 语法糖、以及 Ant Design Vue 图标库的简单组件示例。它根据传入的prop icon 来决定渲染哪一个图标。 <template><DesktopOutlined v-if"icondesktop"/><HomeOutlined v-else-if&quo…

物理信息神经网络(PINN): 将物理知识融合到深度学习中

物理信息神经网络&#xff08;PINN&#xff09;: 将物理知识融合到深度学习中 物理信息神经网络&#xff08;PINN&#xff09;简介PINN的工作原理PINN模型如何利用物理法则指导模型训练1. 定义物理问题和相应的物理定律2. 构建神经网络3. 定义损失函数数据误差项 (Data-fidelit…

IoC原理

Spring框架的IOC是基于Java反射机制实现的&#xff0c;那具体怎么实现的&#xff0c;下面研究一下 反射 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法…

32. 最长有效括号

Problem: 32. 最长有效括号 文章目录 思路解题方法复杂度Code 思路 给你一个只包含 ′ ( ′ ( ′(′ 和 ′ ) ′ ) ′)′ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 我们可以使用动态规划的方法来解决这道题目。我们定义一个 …

Linux 命令行的世界 :1.什么是shell

shell 是一个程序&#xff0c;它接受从键盘输入的命令&#xff0c;然后把命令传递给操作系统去执行。几乎所有的 Linux 发行版都提供一个名为 bash 的来自GNU项目的 shell 程序。现在来启动终端仿真器吧&#xff0c;一旦它运行起来&#xff0c;我们应该看到一行像这样的文字&am…

(52)只出现一次的数字III

文章目录 每日一言题目解题思路代码结语 每日一言 十年磨一剑&#xff0c;风雨未曾阻挡;愿你乘风破浪&#xff0c;不负韶华时光。 题目 题目链接&#xff1a;只出现一次的数字 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现…

面试经典:Java中list set map之间的区别

前言 大家好&#xff0c;我是chowley&#xff0c;最近正在复习Java集合&#xff0c;这次来总结一下list、set、map它们三个之间的区别。 1. List&#xff08;列表&#xff09; 定义&#xff1a; List是一种有序集合&#xff0c;允许存储重复元素&#xff0c;每个元素都有一…

多 split 窗口 in Gtkmm4

文章目录 效果预览实现概要源代码 效果预览 实现概要 使用Gtk::Paned虽然 Paned 只能装两个子控件, 但是我可以嵌套 paned1 装 box1 和 box2 paned2 装 paned1 和 box3 源代码 #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public:ExampleWindow()…