问题标签 [postgraphile]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
45 浏览

ios - PostGraphile 和 Swift (SwiftUI) 集成

我正在为网站构建客户端,该网站提供的 api 是 postGraphile https://api.tetch.app/v1/graphiql。我一直在努力将它与 Swift 集成。如果有人对此有任何资源,将不胜感激!

0 投票
0 回答
60 浏览

error-handling - ra-postgraphile:拦截错误 api 响应

我正在使用 ra-postgraphile 作为 react-admin 项目的数据提供者,我需要拦截错误 api 响应。是否有任何可用的错误对象或函数?如果是,我可以得到一份文件吗?

还在ra-postgraphile repo中发布了一个问题。

源代码

0 投票
1 回答
47 浏览

postgresql - 如何访问服务器内部的 postgraphile 路由

我在我的服务器中创建了postgraphile路由,在我的 app.ts 中有这一行: app.use(postgraphileRoute) 现在,我想在我的存储库中访问这个路由。我正在使用graphql-request包,但我不知道我发送哪个 url 我new GraphQLClient() 尝试发送 serverURL/graphql(我从客户端访问它的方式)但它不起作用。我需要发送哪个网址?

0 投票
1 回答
310 浏览

postgresql - 当启用行级安全性并且使用 NOT LEAKPROOF 运算符时,PostgreSQL 会忽略 pg_trgm GIN 索引

首先,这个 SO 问题描述了一个类似的问题:PostgreSQL query not using INDEX when RLS (Row Level Security) is enabled ,但我无法成功利用它的建议,也想看看是否有改进的方法Postgraphile 上下文中的事物。

复制步骤:

作为超级用户,创建一个简单的表并用一些随机数据填充它:

执行 ILIKE 查询(在本文中进一步称为“ILIKE 查询”,用于多次测试性能):

正如预期的那样,它执行 Seq Scan,执行时间约为 194.823 ms

安装 gp_trgm 扩展并添加一个 gin 索引:

由于表已经填充了数据,因此创建索引需要一些时间(约 10 秒)。现在,运行相同的 ILIKE 查询将使用“trgm_idx_videos_title 上的位图索引扫描”,执行时间为 0.036 毫秒。

到目前为止一切似乎都很好,但前提是您始终可以使用超级用户获取数据并且不为所述表实施额外的安全性。

让我们设置一个额外的用户并授予它连接到我们的数据库的访问权限(名为 gin_rls_test)

我们还需要为该用户之前创建的表授予 SELECT 权限。

为确保我们的用户能够以与目前相同的方式查询数据,请使用 db_login 连接到数据库服务器。(在 pgAdmin 中,您只需创建一个新服务器,指定一些不同的名称,相同的主机名,但使用 db_login/db_login_pwd 作为用户名和密码)

如果您使用新添加的 db_login 连接导航到我们的表,打开查询工具并执行相同的 ILIKE 查询 - 结果应该相同,将应用索引。

打破这一点的是 RLS(行级安全性)。让我们切换回超级用户的查询编辑器并为我们的表设置它:

为简单起见,public.user_has_permission() 函数只返回 true。(在我的情况下,它是一个 plpgsql 函数,它检查存储在 pg_catalog.current_setting 中的设置的权限,并且不执行任何额外的显式请求。)

现在,如果您从超级用户查询编辑器运行 ILIKE 查询,它仍然会像以前一样超级快,因为超级用户避免了 rls。如果从 db_login 查询编辑器运行它,将不再命中索引,将使用 Seq Scan,执行时间约为 1013.485 毫秒。

通读此线程(https://www.postgresql.org/message-id/CAGrP7a3PwDYJhPe53yE6pBPPNxk2Ve4n%2BdPQMS1HcBU6swXYfA%40mail.gmail.com)后,似乎问题发生了,因为 ILIKE 的底层功能不是防漏的。EXPLAIN ANALYZE 告诉我们我们使用操作符 ~~* 进行文本比较,运行这个查询会让你知道这个操作符的底层函数的名称:

实际上有 3 个结果,在我们的例子中,底层函数名称是“texticlike”。您可以做的是切换到超级用户查询编辑器并使该功能防泄漏:

现在,如果您再次从 db_login 查询编辑器运行 ILIKE 查询,索引将被命中并且执行时间将回到 0.040 毫秒。

问题:

也许使某些运算符显式防漏是可以接受的,但真正的问题(除了意外泄漏某些东西,例如如果抛出异常)是只有超级用户才能使函数防漏。如果您有 Azure 或 AWE 托管的数据库,您将没有超级用户访问权限,并且在尝试使函数防漏时会出现以下错误:

所以对我来说,关于如何使 GIN 索引适用于启用 RLS 的表上的 ILIKE 查询,这仍然是一个悬而未决的问题。或者,在仍然将该标题属性作为文本类型的同时实现相同性能结果的替代方法是什么?

我正在使用 Postgraphile,我对提高“includesInsensitive”和“startsWithInsensitive”过滤器的性能很感兴趣,ILIKE 运算符防漏也会影响这些过滤器。

附加信息:

如果您想将功能切换回不防漏:

我尝试使用此查询来查找所有可用的防漏运算符,但在其中没有找到任何可行的替代方案(最接近的是运算符 ^@ 的“starts_with”函数,它区分大小写):

使用 gp_trgm gin index 的最初想法来自这篇文章:https ://niallburkley.com/blog/index-columns-for-like-in-postgres/

PostgreSQL 版本(使用SELECT version();)-“x86_64-pc-linux-musl 上的 PostgreSQL 12.2,由 gcc (Alpine 9.2.0) 9.2.0, 64-bit 编译”

0 投票
0 回答
38 浏览

sql - 在触发器中返回已删除的行

我正在努力返回 if 语句中的任何内容,该语句在返回之前已删除。我想返回基本上被删除的旧行。有什么帮助吗?

它返回新行没有问题,因为它只是更新,但我根本无法返回旧行,它只返回 null。

0 投票
0 回答
38 浏览

graphql - PostGraphile - 按特定 ID 排序结果

所以我试图做一个首先获取某个id的查询。

我知道 sql 语法类似于 -

我试图弄清楚如何在带有分页的 postgraphile 查询中做同样的事情

非常感谢!

0 投票
0 回答
200 浏览

postgresql - postgraphile - 将结构化数据添加为突变字段的功能

我想做最简单的事情,将结构化数据添加到 postgraphile 突变中。

我有一个简单的示例表:

box{kind: "SCALAR", name: "String", ofType: null}通过 postgraphile 创建了一种类型,这让我可以解析查询的结果,并将数据编组为一个字符串以进行突变。

产量

类似的事情发生在polygonorbytea类型上。

在我的理想世界中,我为查询编写了一个计算列函数,它返回box(or polygon, or bytea) 作为一些自定义 postgres 类型。

(不管我是否在该查询中选择了正确的 x/y ......)

但是,我似乎无法弄清楚另一个方向。如何编写一个在 postgraphile 创建的突变上公开的函数,该函数my_table将接受结构化数据(box_arg例如上面的类型),并让函数在突变期间使用函数参数中的值更新记录?我想将box_arg类型作为突变的输入。实际上,您可以在此处看到该框仅input作为字符串可用。

作为字符串的 Box 参数示例

这可以通过 postgres 函数实现吗?或者这只能通过 postgraphile 插件实现?

非常感谢您提供任何建议/示例!

0 投票
0 回答
112 浏览

node.js - 后端无法查询 dockerized postgresql

我正在通过 docker compose 文件运行我的容器。它们在同一个网络中,我可以从我的后端容器 ping 到我的数据库容器。我使用数据库名称作为连接字符串中的主机名,它不会带来任何找不到主机的错误。相反,它只是挂断并超时。

我有一个测试端点,它只是假设测试连接。当您使用该端点时,数据库容器会记录“无效的数据包长度”,而在前端,什么也没有发生,然后它就会超时。我不知道出了什么问题。有什么帮助吗?

0 投票
2 回答
827 浏览

node.js - PG(Node-Postgres)池在 Connect 上挂起……但仅在 Gatsby 内部?

注意:这主要是关于pg或 Node-PostgreSQL 模块的问题。它包含来自 Gatsby 和 Postgraphile 的详细信息,但我不需要这三个方面的专业知识,只需pg.

我有一个数据库,可以很好地与使用 PostGraphile 的 Express 服务器配合使用。我也可以通过node命令行访问它...

完全相同的数据库以前gatsby-source-pg也可以通过插件与 Gatsby/PostGraphile 配合使用......但最近我更改了开发机器,当我尝试构建或运行开发服务器时,Gatsby 挂在“源和转换节点”步骤. 当我调试它时,它挂在对pool.connect().

所以我实际上有两个代码库都使用 PostGraphile,都具有相同的配置,一个有效,另一个无效。更奇怪的是,如果我编辑 Gatsby 插件的源代码,node_modules使其使用完全相同的代码(我可以在命令行成功运行)......它仍然挂起。

我唯一能想到的是其他一些 Gatsby 插件正在使用所有连接并且没有释放它们,但据我所知(例如通过 grep-ing node_modules)没有其他插件甚至使用pg.

所以我真的有两个问题:

A) 谁能帮我理解为什么connect会挂起?如果您能帮助我理解为什么它会使用已知良好的配置并且在 Gatsby 内部(在某些环境因素发生变化之后)这样做,那么奖励积分?

B)任何人都可以帮我解决它吗?如果可能是某种“以前的代码忘记释放连接”问题,有什么方法可以测试吗?如果我能以某种方式登录new Pool().areYouBroken(),那将非常有用。

0 投票
1 回答
95 浏览

node.js - PostgreSQL 上的事务语句构成的函数

我想通过用户networkIdrecoyx.user昵称recoyx_private.user(该功能基于浏览这篇PostGraphile 教程(PostGraphile 结合了 GraphQL 和 PostgreSQL)。

查询运行器在整个函数中给出了无效的语法,包括select * from recoyx.table where table.field = value事务帧和id绑定部分。我从这个例子中获取了查询运行器,它为 PostgreSQL 数据库的初始化、查询和释放查询运行器提供了一个简短的工具(我通过这个postgraphile 模块 API 文档来到这里)。

当我从查询中消除此功能时,它运行良好。据我刚刚看到的点是有效的,本地分配也是如此。那么我的语法真的错了吗?

更新

现在这是我的功能:

我得到了未定义的关系,但是postgres当我运行create function查询时,我正在连接到我的 PostgreSQL 安装(角色)中的默认 root 角色

我已经把项目放在了GitHub 上。我正在运行查询npm run init-database。请参阅environment-example.json(它指定了传统的“postgres”角色)。