node.js - TypeORM jsonb 数组列

标签 node.js postgresql typescript orm typeorm

我正在开发一个 Node 微服务,orm和db分别是typeormpostgresql

我正在尝试创建 jsonb 数组列,但我可能没有以正确的方式进行操作。

注释

  1. 我通常会通过简单地添加一个简单的额外实体和关系来完成此任务。在这种情况下,我被要求使用 jsonb 类型,以便能够修改接口(interface)而不适应架构更改。
  2. 目前存储一个简单的索引 ID 列表也同样足够了。
  3. 我不确定是否应该使用 array: true 列选项。我尝试使用普通 jsonb 对象但没有成功( "{}"::jsonb )。

我的目标:

存储带有索引 id 列的对象数组,并能够添加和删除 id。如果这是不可能的,可以使用平面索引字符串数组。

例如:

[ {id: 'some-uuid-000'}, {id: 'some-uuid-001'}, ... ]

或者:

['some-uuid-000', 'some-uuid-001', 'some-uuid-002']

代码:

我的列定义:

@Column({
        type: 'jsonb',
        array: true,
        default: () => 'ARRAY[]::jsonb[]',
        nullable: false,
    })
    public users: Array<{ id: string }> = [];

我设法获取空数组

const group = await repo.findOneOrFail({ id: groupId });
console.log('>>>>>', group.users);

输出:

>>>>> []

当尝试将项目添加到数组并保持如下时

return repo.update(groupId, { users: [...group.users, { id: userId }] });

我得到以下输出:

2019-12-21 14:40:44.088 UTC [556] ERROR:  malformed array literal: "[{"id":"cc135b8a-b6ed-4cd7-99fc-396228e74509"}]"
2019-12-21 14:40:44.088 UTC [556] DETAIL:  "[" must introduce explicitly-specified array dimensions.
2019-12-21 14:40:44.088 UTC [556] STATEMENT:  UPDATE "group" SET "users" = $2, "created_at" = CURRENT_TIMESTAMP WHERE "id" IN ($1)
(node:5050) UnhandledPromiseRejectionWarning: QueryFailedError: malformed array literal: "[{"id":"cc135b8a-b6ed-4cd7-99fc-396228e74509"}]"

输出错误告诉我配置一定是错误的,因为 postgres 似乎提供了一个普通对象数组,同时期望不同的格式/符号。我在文档中没有找到有关此类场景的详细信息。

最佳答案

最终我找到了以下解决方案:罪魁祸首是 array 列选项,需要将其显式设置为 false,如下例所示:

@Column({
        type: 'jsonb',
        array: false,
        default: () => "'[]'",
        nullable: false,
    })
    public users!: Array<{ id: string }>;

未设置时,typeorm 会自动推断 postgres 列类型为 jsonb[](而不是普通的 jsonb),这不允许执行 jsonb_set 操作。

关于node.js - TypeORM jsonb 数组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59437390/

相关文章:

node.js - Google Datastore 仍然指向 App Engine 生产数据库而不是本地模拟器

node.js - 如何使用paypal orders api指定收款人?

postgresql - Azure PostgreSQL 无法将 BYPASSRLS 分配给角色

javascript - PostgreSQL + Sequelize + array_append 错误

javascript - 我如何循环动画循环进度组件

typescript - TypeScript 中包含数组的接口(interface)

node.js - 如何使用redis在 Node 中缓存查询数据

postgresql - 在 PostgreSQL 中用作 NOOP 的是什么?

node.js - TS2345 Sequelize 创建功能

javascript - 类型错误:myParser.MessageParser 不是构造函数