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

问题描述 投票:0回答:2

我有一个 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 对象?

sql postgresql intervals knex.js
2个回答
9
投票

事实证明,通过我从一个模块跳转到另一个模块的研究,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 如何将一些工作传递给其他模块的认识,这些模块也传递了工作,但是我写了这个自我回答的问题,所以没有其他人需要花费无数的时间来试图解决这个问题。


0
投票

您可以使用

INTERVAL
:
 重置用于 
setTypeParser

类型列的解析器
import { types } from "pg";

types.setTypeParser(
  types.builtins.INTERVAL,
  (val) => val
);
© www.soinside.com 2019 - 2024. All rights reserved.