我有一个 PostgreSQL 表,其中有一列类型为
interval
的列,它以 ISO 8601 格式存储持续时间,即 P1D
等于“1 天”。
我遇到的问题是,当使用 Knex.js 从数据库中选择此数据时,如果我在命令行界面中执行相同的基本选择查询,数据将从字符串
P1D
转换为 JSON 对象 {"days":1}
我得到了字符串 P1D
,并且可以选择设置输出的样式 SET intervalStyle = iso_8601
。
据我所知,这是由 Knex.js 的依赖项“node-pg-types”完成的,而该依赖项又使用“postgres-interval”。在 Bookshelf.js 中,您可以设置数据处理器,并且直接使用“pg”模块可以设置不同的类型行为,但是目前还不清楚如何修改 Knex.js 在这方面的行为,但 Bookshelf 还不清楚。 Node.js 可以做到这一点,并且是基于 Knex.js 构建的。
简而言之,我的问题是如何使 Knex.js 在间隔列上输出 ISO 8601 样式间隔而不是 JSON 对象?
事实证明,通过我从一个模块跳转到另一个模块的研究,Knex.js 确实使用“node-pg-types”来格式化间隔列,而这又使用“postgres-interval”,两个模块文档都没有这一点都很好。
在研究“postgres-interval”时,很明显返回的数据是一个 JavaScript 对象,它被编码成看起来像 JSON 的内容,但是阅读此模块的文档,它实际上具有可以调用以获取任何格式的数据的函数。格式:
https://github.com/bendrucker/postgres-interval
interval.toPostgres() -> 字符串 返回一个区间字符串。这允许将间隔对象传递到准备好的语句中。
interval.toISO() -> 字符串 返回符合 ISO 8601 的字符串。
所以答案是将
.toISO()
添加到您的代码中。
我会通知开发人员,这种特殊行为没有得到很好的记录,这样他们就可以提高对 Knex.js 如何将一些工作传递给其他模块的认识,这些模块也传递了工作,但是我写了这个自我回答的问题,所以没有其他人需要花费无数的时间来试图解决这个问题。
您可以使用
INTERVAL
:重置用于
setTypeParser
类型列的解析器
import { types } from "pg";
types.setTypeParser(
types.builtins.INTERVAL,
(val) => val
);