直接在 GraphQL API 中查询自定义 PostgreSQL 函数

[](https://res.cloudinary.com/practicaldev/image/fetch/s--tWbTkT6s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://blog.hasura.io/ content/images/downloaded_images/using-custom-sql-functions-for-queries-with-postgres-and-graphql-ddca6caf6681/1-Le_7ag5x2iCzW92YgOfQ3g.png)

TL;DR

您现在可以运行查询(或订阅),如下所示:

search_articles是一个自定义 SQL 函数,它采用文本输入来搜索article表(下面的详细示例)

自定义SQL函数

自定义 SQL 函数是您可以定义的过程,它们存储在数据库中,可以被调用以在数据库上运行并返回最终结果。

这可用于直接在数据库本身上运行一些常见的业务逻辑,否则可能会:

  • 必须在数据库的所有客户端上复制

  • 需要对数据库进行多次查询才能计算

功能概览

目前,只能在 GraphQL API 中查询以下类型的 Postgres 函数(terminology fromPostgres docs):

  • 功能行为:仅STABLEIMMUTABLE

  • 返回类型:必须是SETOF <table-name>

  • 参数模式:仅IN

注意: 您还可以支持需要返回自定义类型的函数,即通过创建和跟踪具有所需架构的空表来支持该函数的行集 - 请参见下面的第二个示例

自定义功能的访问控制

为函数的SETOF表配置的访问控制权限也适用于函数本身。

如何在 GraphQL API 中查询函数

让我们看看您可以通过两个示例使用此功能:

示例:自定义文本搜索功能

在文章/作者模式的通常上下文中,假设我们创建并跟踪了一个自定义函数search_articles,其定义如下:

(这只是一个示例函数,您也可以使用ilike参数来过滤文章table中的结果_😆)_

此函数根据输入文本参数search过滤article表中的行,即它返回SETOF article。一旦您创建并跟踪了此函数(使用Data->SQLHasura 控制台的部分),您可以调用 GraphQL API 中的自定义函数(使用 TL;DR 部分中的示例查询):

直接在 GraphQL API 中查询自定义函数search_articles

示例:基于 PostGIS 的函数

在某些情况下,您的自定义函数返回的结果集或表中的行不属于您现有的模式。在这种情况下,您需要创建和跟踪此表以在 GraphQL API 中添加对您的函数的支持。让我们看看如何使用基于PostGIS的示例来做到这一点。

假设您有 2 个表,用于用户和地标位置数据,具有以下定义:

您可以使用以下突变和变量使用测试数据填充这些表:

在此示例中,我们希望获取给定用户附近的地标列表,以及同一查询中的用户详细信息。 PostGIS 的内置函数ST_Distance可用于实现此用例。

由于我们的用例需要一个不是任何现有表的“subset”的输出,即SETOF表不存在,让我们首先创建这个表,然后使用以下定义创建我们的位置搜索功能(once again ,我们将使用 theData->SQL部分Hasura控制台):

此函数获取用户信息(for the given inputuserid)和距离用户位置不到distance_kms公里的地标列表作为 JSON 字段。我们现在可以在我们的 GraphQL API 中引用这个函数并获得相应的响应,如下所示:

询问:

示例响应:

请注意,您还可以:

  • 使用<function-name>_aggregate字段对自定义函数使用聚合。

  • 在基于函数的查询中使用wherelimitorder_byoffset等参数。

试试看

请尝试使用此功能,让我们知道您的想法!对更多函数类型和突变函数的支持正在进行中。如果您想收到有关后续迭代更新的通知,请在社区Discord或Github上给我们留言!

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐