首页 > 解决方案 > 为什么使用 Knex.js 选择 PostgreSQL 间隔会返回 JSON 或 JavaScript 对象而不是字符串?

问题描述

我有一个 PostgreSQL 表,其中有一列以intervalISO 8601 格式存储持续时间,即P1D等于“1 天”。

我遇到的问题是,当使用 Knex.js 从数据库中选择此数据时,数据会从字符串P1D转换为 JSON 对象{"days":1},如果我在命令行界面中执行相同的基本选择查询,我会P1D返回字符串,并且可以选择设置输出的样式SET intervalStyle = iso_8601

尽我所能告诉这是通过称为“node-pg-types”的 Knex.js 的依赖项来完成的,该依赖项又使用“postgres-interval”。在 Bookshelf.js 中你可以设置一个数据处理器,并且直接使用“pg”模块你可以设置不同的类型行为,但是在这方面如何修改 Knex.js 的行为并不清楚,但是 Bookshelf。 Node.js 可以做到这一点,并且建立在 Knex.js 之上。

简而言之,我的问题是如何让 Knex.js 在间隔列而不是 JSON 对象上输出 ISO 8601 样式间隔?

标签: sqlpostgresqlintervalsknex.js

解决方案


事实证明,通过我从一个模块跳转到另一个模块的研究,确实 Knex.js 确实使用“node-pg-types”来格式化间隔列,并且反过来使用“postgres-interval”,这两个模块都没有记录很好。

在查看“postgres-interval”时,很明显返回的数据是一个 JavaScript 对象,它被编码成看起来像 JSON 的东西,但是阅读这个模块上的文档它实际上有你可以调用的函数来获取任何格式的数据:

https://github.com/bendrucker/postgres-interval

interval.toPostgres() -> string 返回一个间隔字符串。这允许将间隔对象传递到准备好的语句中。

interval.toISO() -> string 返回符合 ISO 8601 的字符串。

所以答案是附加.toISO()到您的代码中。

我会通知开发人员,这种特殊行为没有得到很好的记录,因此他们可以寻求提高对 Knex.js 如何将一些工作传递给其他模块的认识,这些模块也传递工作,但是我写了这个自我回答的问题,所以没有人否则必须花费无数小时试图弄清楚这一点。


推荐阅读