【问题标题】:Node-Postgres/Knex returning CITEXT[] as a string in JS, instead of an array of stringsNode-Postgres/Knex 在 JS 中返回 CITEXT[] 作为字符串,而不是字符串数组
【发布时间】:2021-02-11 11:28:20
【问题描述】:

我正在使用Knex,它本身使用包"pg" (aka "node-postgres").

如果您从具有TEXT[] 列的表中选择一些行,那么一切都很好……在 JS 中,您会得到一个字符串数组。

但是,如果您使用的是 CITEXT[] 列,那么您只需在 JS 中返回一个字符串,例如:

"{First-element,Second-element}"

通常,当您想指示 pg 包如何返回特定的 postgres 类型时,您可以执行以下操作:

import {types} from 'pg';
types.setTypeParser(types.builtins.TIMESTAMPTZ, 'text');
types.setTypeParser(types.builtins.TIMESTAMP, 'text');
types.setTypeParser(types.builtins.DATE, 'text');
types.setTypeParser(types.builtins.TIME, 'text');
types.setTypeParser(types.builtins.TIMETZ, 'text');

types.builtins.* 常量的值是 postgres 中已知内置类型的硬编码 OID 编号。这些 OID 编号在所有 postgres 安装中都是相同的。

但是由于CITEXT[] 是一个扩展,CITEXT + CITEXT[] 类型的 OID 编号在每台服务器上都会有所不同,例如使用以下 SQL 查询:

SELECT typname, oid, typarray FROM pg_type WHERE typname like '%citext%';

在我的开发服务器上,我得到:

typname|oid  |typarray|
-------|-----|--------|
citext |17459|17464   |
_citext|17464|0       |

但在我的生产服务器上,我得到:

typname|oid  |typarray|
-------|-----|--------|
citext |18618|18623   |
_citext|18623|0       |

我该如何解决这个问题?

我真的不想做的一些 hacky 选项是:

  1. 找出我所有服务器的所有不同 OID 值并将它们硬编码到其中 - 非常 hacky,真的不想这样做。
  2. 专门为手动将字符串转换为数组的每个表/列编写代码 - 也很老套和重复
  3. 当节点进程初始化时,获取服务器的 OID 值,然后使用该动态值调用 types.setTypeParser() 函数 - 也不是很好

如果没有这些 hacky 解决方案,我该如何解决所有表格/列的问题?

【问题讨论】:

    标签: node.js arrays postgresql knex.js node-postgres


    【解决方案1】:

    我不相信有任何方法可以在不查询数据库的情况下做到这一点。

    我可能会在启动节点应用程序之前查询正确的 OID 号并将其存储到环境变量中,然后使用 process.env 中的值初始化 pg 类型。

    这也有点 hacky,但至少 hack 大部分是封装在应用程序代码之外的。

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多