Node-Postgres / Knex返回CITEXT []作为JS中的字符串,而不是字符串数组

时间:2020-10-29 02:16:26

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

我正在使用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. 为每个手动将字符串转换为数组的表/列编写代码-hacky和重复的
  3. 当节点进程初始化时,获取服务器的服务器OID值,然后使用该动态值调用types.setTypeParser()函数-效果也不佳

如果没有这些骇人听闻的解决方案,如何解决所有表/列的问题?

1 个答案:

答案 0 :(得分:0)

我不相信没有查询数据库的方法。

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

这也有点hacky,但至少该hack大多封装在应用程序代码之外。

相关问题