使用自定义 SQL 函数进行 Postgres 和 GraphQL 查询
直接在 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):
-
功能行为:仅
STABLE
或IMMUTABLE
-
返回类型:必须是
SETOF <table-name>
-
参数模式:仅
IN
注意: 您还可以支持需要返回自定义类型的函数,即通过创建和跟踪具有所需架构的空表来支持该函数的行集 - 请参见下面的第二个示例。
自定义功能的访问控制
为函数的SETOF
表配置的访问控制权限也适用于函数本身。
如何在 GraphQL API 中查询函数
让我们看看您可以通过两个示例使用此功能:
示例:自定义文本搜索功能
在文章/作者模式的通常上下文中,假设我们创建并跟踪了一个自定义函数search_articles
,其定义如下:
(这只是一个示例函数,您也可以使用ilike
参数来过滤文章table
中的结果_😆)_
此函数根据输入文本参数search
过滤article
表中的行,即它返回SETOF article
。一旦您创建并跟踪了此函数(使用Data
->SQL
Hasura 控制台的部分),您可以调用 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
字段对自定义函数使用聚合。 -
在基于函数的查询中使用
where
、limit
、order_by
、offset
等参数。
试试看
请尝试使用此功能,让我们知道您的想法!对更多函数类型和突变函数的支持正在进行中。如果您想收到有关后续迭代更新的通知,请在社区Discord或Github上给我们留言!
更多推荐
所有评论(0)