为什么选择 PostgreSQL 间隔使用 Knex.js returns 一个 JSON 或 JavaScript 对象而不是字符串?
Why does selecting PostgreSQL interval using Knex.js returns a JSON or JavaScript object rather than a string?
我有一个 PostgreSQL table,它有一个 interval
类型的列,它以 ISO 8601 格式存储持续时间,即 P1D
等于“1 天”。
我遇到的问题是,当使用 Knex.js 从数据库中 select 读取此数据时,数据从字符串 P1D
转换为 JSON 对象{"days":1}
,如果我在命令行界面中执行相同的基本 select 查询,我会返回字符串 P1D
,并且可以选择设置输出样式 SET intervalStyle = iso_8601
。
据我所知,这是通过 Knex.js 的依赖项 "node-pg-types" 完成的,该依赖项又使用 "postgres-interval"。在Bookshelf.js中你可以设置一个数据处理器,直接使用"pg"模块你可以设置不同的类型行为,但是完全不清楚如何修改Knex.js的行为在这个尊重,但 Bookshelf.js 可以做到这一点并且建立在 Knex.js.
之上
简而言之,我的问题是如何使 Knex.js 在间隔列而不是 JSON 对象上输出 ISO 8601 样式间隔?
事实证明,通过我从一个模块跳到另一个模块的研究,确实 Knex.js 确实使用 "node-pg-types" 来格式化间隔列,而这反过来又使用 "postgres-interval" ,这两个模块都没有很好地记录这一点。
在查看 "postgres-interval" 时,很明显返回的数据是一个 JavaScript 对象,它被编码成看起来像 JSON 的东西,但是阅读这个模块的文档实际上有你可以调用的函数来获取任何格式的数据:
https://github.com/bendrucker/postgres-interval
interval.toPostgres() -> string
Returns an interval string. This allows the interval object to be passed into prepared statements.
interval.toISO() -> string
Returns an ISO 8601 compliant string.
所以答案是将 .toISO()
附加到您的代码。
我会通知开发人员,此特定行为没有得到很好的记录,因此他们可以提高对 Knex.js 如何将一些工作传递给其他模块的认识,这些模块也会传递工作关闭,但是我写了这个自我回答的问题,所以其他人不必花费无数时间来解决这个问题。
我有一个 PostgreSQL table,它有一个 interval
类型的列,它以 ISO 8601 格式存储持续时间,即 P1D
等于“1 天”。
我遇到的问题是,当使用 Knex.js 从数据库中 select 读取此数据时,数据从字符串 P1D
转换为 JSON 对象{"days":1}
,如果我在命令行界面中执行相同的基本 select 查询,我会返回字符串 P1D
,并且可以选择设置输出样式 SET intervalStyle = iso_8601
。
据我所知,这是通过 Knex.js 的依赖项 "node-pg-types" 完成的,该依赖项又使用 "postgres-interval"。在Bookshelf.js中你可以设置一个数据处理器,直接使用"pg"模块你可以设置不同的类型行为,但是完全不清楚如何修改Knex.js的行为在这个尊重,但 Bookshelf.js 可以做到这一点并且建立在 Knex.js.
之上简而言之,我的问题是如何使 Knex.js 在间隔列而不是 JSON 对象上输出 ISO 8601 样式间隔?
事实证明,通过我从一个模块跳到另一个模块的研究,确实 Knex.js 确实使用 "node-pg-types" 来格式化间隔列,而这反过来又使用 "postgres-interval" ,这两个模块都没有很好地记录这一点。
在查看 "postgres-interval" 时,很明显返回的数据是一个 JavaScript 对象,它被编码成看起来像 JSON 的东西,但是阅读这个模块的文档实际上有你可以调用的函数来获取任何格式的数据:
https://github.com/bendrucker/postgres-interval
interval.toPostgres() -> string Returns an interval string. This allows the interval object to be passed into prepared statements.
interval.toISO() -> string Returns an ISO 8601 compliant string.
所以答案是将 .toISO()
附加到您的代码。
我会通知开发人员,此特定行为没有得到很好的记录,因此他们可以提高对 Knex.js 如何将一些工作传递给其他模块的认识,这些模块也会传递工作关闭,但是我写了这个自我回答的问题,所以其他人不必花费无数时间来解决这个问题。