我正在使用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选项是:
如果没有这些骇人听闻的解决方案,如何解决所有表/列的问题?
答案 0 :(得分:0)
我不相信没有查询数据库的方法。
在启动节点应用程序之前,我可能会查询正确的OID编号并将其存储到环境变量,然后使用process.env中的值初始化pg类型。
这也有点hacky,但至少该hack大多封装在应用程序代码之外。