【发布时间】: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 选项是:
- 找出我所有服务器的所有不同 OID 值并将它们硬编码到其中 - 非常 hacky,真的不想这样做。
- 专门为手动将字符串转换为数组的每个表/列编写代码 - 也很老套和重复
- 当节点进程初始化时,获取服务器的 OID 值,然后使用该动态值调用 types.setTypeParser() 函数 - 也不是很好
如果没有这些 hacky 解决方案,我该如何解决所有表格/列的问题?
【问题讨论】:
标签: node.js arrays postgresql knex.js node-postgres