我正在开发节点微服务,orm和db分别为typeorm
和postgresql
我正在尝试创建jsonb
数组列,但是我可能没有正确的方法。
注释
jsonb
类型,以便能够在不适应模式更改的情况下修改接口。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似乎提供了一个普通的对象数组,同时期望使用不同的格式/符号。我在文档中找不到有关这种情况的详细信息。
答案 0 :(得分:0)
最终,我找到了以下解决方案:罪魁祸首是array
列选项,需要将其显式设置为false,如下例所示:
@Column({
type: 'jsonb',
array: false,
default: () => "'[]'",
nullable: false,
})
public users!: Array<{ id: string }>;
当未设置时,typeorm会自动推断出postgres列类型为jsonb[]
(而不是普通的jsonb
),这不允许执行jsonb_set
操作。