如果您能给我提建议,我将不胜感激. 我在node.js下使用Postgres 16和PostgreSQL客户端 存在一个具有用户定义类型的表:

CREATE TYPE my_type AS ENUM ('value1', 'value2');

CREATE TABLE table2
(
 id bigint PRIMARY KEY,
 t1_id ...,
 field1 my_type default 'value1'
 field2 integer
);

我想在联接中使用它:

SELECT
   table1.field1 as t1f1, ...
   array_agg(table2.field1) as t2f1,
   array_agg(table2.field2) as t2f2,
   array_agg(table3.field1) as t3f1,
   ...
FROM table1 
   LEFT JOIN table2 ON table2.t1_id = table1.id
   LEFT JOIN table 3 ON table3.t1_id=table1.id
   ...
GROUP BY table1.id

但出于某种原因,我得到了这一列(在本例中为t2f1)的结果,它是一个带有原始postgres数组的字符串,而不是像其他列那样的常规数组:

[
  {
    t1f1: "blah-blah",
    t2f1: "{NULL, NULL, NULL, NULL}",
    t2f2: [NULL, NULL, NULL, NULL],
    t3f1: [NULL, NULL, NULL, NULL],
  }
]

因此,问题是如何强制postgres客户端正确处理枚举.

推荐答案

原因是node-postgres knows how to parse the representation f或 a few built-in types喜欢text[]integer[],但不是my_type[]-它不知道my_type是枚举,也不知道postgres作为结果的一部分返回的类型id引用数组类型.它只是默认为字符串反序列化.

您可以通过向您的SQL(array_agg(table2.field1::text)array_agg(table2.field1)::text[])添加强制转换来解决此问题.

但是,如果您实际上想让pg正确地解析任何出现的这种类型的值,则需要使用use pg-types来设置类型解析器.开始执行

SELECT typname, oid, typarray FROM pg_type WHERE typname = 'my_type';

SELECT 'my_type[]'::regtype::oid;

找到枚举类型的typarray oid.然后在你的代码中,当设置pg时,告诉它解析my_type[]的数据,就像解析text[]一样:

const OID_ARRAY_TEXT = 1009;
const OID_ARRAY_MY_TYPE = …; // whatever oid number you got

pg.types.setTypeParser(OID_ARRAY_MY_TYPE, pg.types.getTypeParser(OID_ARRAY_TEXT));

See also issues node-pg-types#56 and #68.

Node.js相关问答推荐

MongoDB-如何验证Document字段以仅允许特定的文件扩展名?

Sequelize-测试使用虚拟场更新模型

如何在ejs模板中使用循环显示多个结果?

ForbidenError:使用Express.js的CSRF令牌无效

在 NodeJS 中使用 post 时出现错误 500TypeError: 无法解构 'req.body' 的属性 'name',因为它未定义

Typescript typeRoots 未检测到类型定义

在 `DataFrame` 上使用用户定义的可链接函数抽象出 Polars 表达式

tsc:当我上传 React+next js 和 node 项目时,在 heroku 找不到

为什么在调用数据库调用时我的参数没有定义?

如何为一个网站实现这 2 个网址.即 www.administrator.sitename.com 和 www.sitename.com?

Socket IOFlutter 未连接

无服务器无法获取所有记录事件对象验证失败?

npm 不会安装 express 吗?

TypeError:请求路径包含未转义的字符,我该如何解决这个问题

异步构造函数

Puppeteer 记录在 page.evaluate

安装Node.js 安装n 安装Node.js?

Node.js 与 .net 中的异步/等待

Socket.IO 连接用户数

如何从 Node.js 应用程序Ping?