内容提要
Supabase 的 Postgres Changes 功能新增三项改进:支持多列组合过滤、更多过滤操作符(如 like、is、正则等),以及列选择以仅返回所需字段。这些功能可减少消息和带宽消耗,降低计费成本。需注意列选择需客户端库 2.109.0+,DELETE 事件仅含主键,且暂不支持 OR 组合。
延伸解读
组合过滤的实际价值
此前过滤器只能针对单列,开发者常需订阅整个表再在客户端丢弃无关数据,既浪费带宽又增加处理逻辑。现在支持多列组合过滤(以逗号分隔,条件间为AND关系),例如同时匹配状态和团队,可直接在服务端过滤,减少消息量和客户端负担。这一改进对实时看板、工单系统等场景尤为实用。
列选择与计费优化
列选择功能允许订阅时指定返回字段,未指定的列不会出现在payload中,从而减少传输字节数。由于Realtime按消息数和出站流量计费,这能直接降低使用成本。但需注意,该功能为可选,现有订阅默认仍返回整行,需显式添加select选项才能生效。
使用限制与注意事项
列选择要求客户端库版本不低于2.109.0,且所选列必须对订阅角色可见,Row Level Security依然生效。DELETE事件仅携带主键,因此无法基于其他列过滤删除操作。当前仅支持AND组合,不支持OR,且数组、JSON包含、全文搜索和范围操作符尚未覆盖。
Q&A
Postgres Changes 新增了哪些功能?
Postgres Changes 新增了三个功能:支持多列组合过滤、更多过滤操作符(如 like、ilike、is、match、imatch、isdistinct 等),以及列选择功能,可以只返回需要的字段。
如何在 Postgres Changes 中实现多列组合过滤?
在 filter 参数中用逗号分隔多个条件,每个条件都必须匹配(AND 逻辑)。例如:filter: 'status=eq.open,team=eq.billing' 表示同时匹配 status 为 open 且 team 为 billing 的行。
Postgres Changes 新增了哪些过滤操作符?
新增了 like 和 ilike 用于模式匹配,is 用于 null 和布尔检查,match 和 imatch 用于 POSIX 正则表达式,以及 isdistinct 用于 NULL 安全的不等比较。还可以用 not. 前缀来反转条件。
如何使用列选择功能来减少返回的数据量?
在订阅配置中添加 select 选项,并传入一个包含所需列名的数组。例如:select: ['id', 'subject', 'updated_at']。这样事件负载中只会包含这些列,但主键始终会包含在内。
Postgres Changes 的过滤和列选择如何影响计费?
Realtime 按消息和出口流量计费。过滤掉的事件不会发送给订阅者,从而节省消息数;列选择减少了每个事件传输的字节数,从而降低出口流量。因此,这些功能可以减少计费使用量,降低相同工作负载的成本。
使用 Postgres Changes 的列选择功能有什么注意事项?
列选择需要 @supabase/supabase-js 2.109.0 或更高版本。列出的列必须对订阅角色可选中,并且行级安全(RLS)仍然适用。另外,DELETE 事件只包含主键,因此无法对删除事件进行列过滤。
Postgres Changes 目前不支持哪些过滤功能?
目前不支持数组和 JSON 包含、全文搜索、范围操作符,以及 OR 组合。这些功能尚未计划实现。