【问题标题】:Why does selecting PostgreSQL interval using Knex.js returns a JSON or JavaScript object rather than a string?为什么使用 Knex.js 选择 PostgreSQL 间隔会返回 JSON 或 JavaScript 对象而不是字符串?
【发布时间】:2019-01-04 23:59:23
【问题描述】:

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

我遇到的问题是,当使用 Knex.js 从数据库中选择此数据时,如果我在命令中执行相同的基本选择查询,则数据将从字符串 P1D 转换为 JSON 对象 {"days":1} line interface 我得到了字符串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 样式的区间?

【问题讨论】:

    标签: sql postgresql intervals knex.js


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多