TypeORM jsonb数组列

时间:2019-12-21 15:21:39

标签: node.js postgresql typescript orm typeorm

我正在开发节点微服务,orm和db分别为typeormpostgresql

我正在尝试创建jsonb数组列,但是我可能没有正确的方法。

注释

  1. 通常我只需添加一个简单的额外实体和关系即可完成此任务。在这种情况下,系统已要求我在类型中使用jsonb类型,以便能够在不适应模式更改的情况下修改接口。
  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似乎提供了一个普通的对象数组,同时期望使用不同的格式/符号。我在文档中找不到有关这种情况的详细信息。

1 个答案:

答案 0 :(得分:0)

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

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

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