PostgREST v11.1 有哪些新功能?

PostgREST v11.1 有哪些新功能?

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

PostgREST 11.1在Supabase平台上线,新增角色设置、查询超时和成本限制功能,支持批量插入JSON并考虑默认值,提供ANY/ALL过滤器修饰符。升级后,API安全性增强,适用于2023年7月5日后创建的Supabase项目。

🔎

延伸解读

角色级查询限制:安全与性能的平衡

PostgREST 11.1 允许通过 ALTER ROLE 为不同角色设置 statement_timeout 和 plan_filter.statement_cost_limit。例如,anon 角色可设 100ms 超时和较低成本限制,防止恶意或低效查询消耗资源;authenticated 角色可放宽限制;service_role 可无限制。成本限制在查询计划阶段终止高成本查询,比超时更早生效。但需注意,成本限制调优不当可能误杀合法查询,应谨慎设置。

事务隔离级别可配置:按需提升一致性

现在可以通过 default_transaction_isolation 为函数或角色设置事务隔离级别,如 repeatable read 或 serializable。默认的 read committed 适用于绝大多数场景,更高隔离级别会引入额外锁开销,仅在需要更强一致性保证时使用。例如,可为 service_role 设置 serializable,但需注意性能影响。此功能让开发者无需直接连接 PostgreSQL 即可调整隔离级别。

批量插入支持默认值:简化数据操作

新增的 defaultToNull: false 选项允许在批量插入 JSON 时,让未提供的列使用数据库默认值,而不是插入 NULL。例如,向表 foo 插入多行时,未指定 id 和 baz 的列会自动采用默认值。这简化了客户端代码,避免了为每行显式提供所有字段。该功能是社区长期需求,提升了开发效率。

ANY/ALL 过滤器修饰符:更简洁的查询语法

PostgREST 11.1 为 eq、like、gt 等过滤器增加了 any 和 all 修饰符,作为 OR 条件的快捷方式。例如,likeAnyOf('username', ['%supa%', '%kiwi%']) 等价于 SQL 中的 username LIKE ANY('{%supa%,%kiwi%}')。这减少了复杂 OR 过滤器的编写,使查询更简洁。所有支持 eq、like、ilike、gt、gte、lt、lte、match、imatch 的过滤器均可使用。

❓

Q&A

PostgREST 11.1 新增了哪些角色设置功能?

PostgREST 11.1 允许对不同角色设置查询超时和成本限制,增强了 API 的安全性。

如何设置查询超时以防止高成本查询?

可以通过 ALTER ROLE 命令为不同角色设置查询超时,例如匿名用户的超时为 100 毫秒。

PostgREST 11.1 如何处理批量插入 JSON 数据?

支持批量插入 JSON 数据,并考虑列的默认值,简化了数据插入过程。

什么是查询成本限制功能,它是如何工作的?

查询成本限制功能在查询计划阶段终止高成本查询,避免资源浪费。

PostgREST 11.1 中的 ANY/ALL 过滤器修饰符有什么用?

ANY/ALL 过滤器修饰符简化了 OR 过滤器的使用,使得查询更加灵活。

升级到 PostgREST 11.1 对现有项目有什么影响?

现有项目可以通过暂停和恢复来升级,整体破坏性变化较小。

🏷️

标签

➡️

继续阅读