暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL 15 新特性划重点:SQL合并、为公共架构撤销 CREATE 权限……

原创 小小亮 2022-10-17
312

Postgres  15 的稳定版本已发布。我最初想写下我们如何在 Hasura 中添加对 Postgres 15 的支持,但这可能会很无聊,因为在我们的初始测试中一切都是开箱即用的,尽管我们是希望尽快利用一些 Postgres 15 功能。

使用 Hasura Cloud 试用 Postgres 15并获取 Instant GraphQL API 或检查下面帖子中的 docker compose 设置以在本地试用。

让我们看看此版本中的主要功能和更改,以及它将如何影响未来的使用。

SQL 合并

MERGE命令是带有 v15 版本的 Postgres DB 的最新添加之一。它以前是其他 SQL 变体(如 SQL Server)的标准功能。查看有关 graphql-engine 的 RFC,了解如何通过 SQL Server 上的 Hasura GraphQL API 支持各种类似的操作。

合并语句是INSERT,UPDATE和的组合DELETE

合并语句允许将表中的数据source引入target表中。

让我们通过一个例子来理解MERGE用例:

SQL 合并用例
SQL 合并用例

目标表有 3 行,源表有 3 行。源表中的数据应merged放入target表中。有几个条件:

  • 匹配
  • 不匹配

在这两种情况下,下一次执行都是基于WHEN子句。对于上面的例子,第一行的操作在匹配时可以是 DO NOTHING,因为数据没有改变。对于第二行,product_quantity已更改,因此这将是一个UPDATE操作。对于源表上的第三行,这将是一个INSERT操作,因为该行在目标表上不存在。

Postgres的现有INSERT … ON CONFLICT功能应该涵盖大多数用例。Postgres 上的 Upsert 是使用语句on conflict的功能实现的,insert而 SQL Server 上的 Upsert 行为是通过更通用的MERGE语句实现的。在这个 v15 版本中,现在可以通过 Postgres 使用相同的功能,因为 merge 具有比 INSERT ON CONFLICT 功能更多的功能。

该命令无需执行多个 INSERT / UPDATE / DELETE 语句,而是MERGE让您有条件地配置当某些内容匹配和不匹配时要执行的操作。

为公共架构撤销 CREATE 权限

Postgres 15 从模式中删除了全局写入权限public例如,如果您使用的用户没有超级用户权限,则CREATEon 语句public将不再起作用。

# this doesn't work anymore

CREATE table author (id integer, name text);
复制

以后您将收到权限被拒绝错误。从安全角度来看,这很好,因为公共架构被 ab(used) 用于转储所有内容,但search_path默认情况下也会公开。

Hasura 支持只读 Postgres,因此如果您想授予对公共模式的访问权限以仅读取,它将继续按预期工作。

结构化 JSON 日志记录

PostgreSQL 支持多种记录服务器消息的方法,包括 stderr(默认)、csvlog 和 syslog。此版本还支持jsonlog,方便导出日志和调试。为了启用此功能,请jsonlog在文件log_destination内部添加postgresql.conf

这将是一个很好的功能,可以导出到 HoneyComb 和 DataDog 等日志记录和监控工具。

性能改进

此版本在管理本地和分布式部署中的工作负载方面带来了一些性能改进。内存中和磁盘上的排序算法得到了改进,根据排序的数据类型,性能提升了 25% 到 400%。

使用 docker compose 在本地试用 Postgres 15

如果您想使用 docker 在本地运行 Postgres,这里有一个快速 docker compose,它可以启动最新的 Postgres 并在顶部添加 Hasura GraphQL API,这一切都在几秒钟内完成。

请注意,我们目前正在使用 rc2 标签,因为在撰写本文时, postgres docker上尚未发布最终的稳定版本。

version: '3.6'
services:
  postgres:
    image: postgres:15rc2
    restart: always
    volumes:
    - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgrespassword
    ports:
    - "5432:5432"
  graphql-engine:
    image: hasura/graphql-engine:v2.13.0
    ports:
    - "8080:8080"
    depends_on:
    - "postgres"
    restart: always
    environment:
      ## postgres database to store Hasura metadata
      HASURA_GRAPHQL_METADATA_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## this env var can be used to add the above postgres database to Hasura as a data source. this can be removed/updated based on your needs
      PG_DATABASE_URL: postgres://postgres:postgrespassword@postgres:5432/postgres
      ## enable the console served by server
      HASURA_GRAPHQL_ENABLE_CONSOLE: "true" # set to "false" to disable console
      ## enable debugging mode. It is recommended to disable this in production
      HASURA_GRAPHQL_DEV_MODE: "true"
      HASURA_GRAPHQL_ENABLED_LOG_TYPES: startup, http-log, webhook-log, websocket-log, query-log
      ## uncomment next line to set an admin secret
      HASURA_GRAPHQL_ADMIN_SECRET: myadminsecretkey
volumes:
  db_data:
复制

后续步骤

Hosted Postgres 供应商需要几天时间才能正式支持 Postgres 15。目前大多数供应商都支持最新的 Postgres v14.4 稳定版本。

你现在应该升级吗?如果您已经在 Postgres 的早期版本上运行生产工作负载,那么值得等待一个小版本,以避免可能发生的任何迁移错误和数据损坏。另一方面,如果您正在尝试一个新的 Postgres 实例,那么一定要试试!


原文标题:PostgreSQL 15 released: Top things to know

原文链接:https://hasura.io/blog/postgresql-15-released-top-things-to-know/


最后修改时间:2022-10-17 12:00:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论