我正在开发一个节点微服务,orm和db分别是typeorm
和postgresql
。
我正在尝试创建jsonb
数组列,但我可能没有这样做。
Notes
jsonb
类型来修改接口,而不必满足模式jsonb
的要求--一个简单的索引ids列表现在已经足够了。array: true
列选项。我尝试使用一个普通的jsonb
对象,但没有成功( "{}"::jsonb
)。我的目标:
使用索引的 id
列存储对象数组,并能够添加和删除ids。如果这是不可能的,那么使用平面索引字符串数组就可以了。
例如:
[ {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似乎提供了一个普通的对象数组,同时需要一个不同的格式/表示法。我还没有在文档中找到关于这类场景的详细信息。
发布于 2019-12-21 22:40:59
最后,我找到了以下解决方案:罪魁祸首是array
列选项,需要显式地将其设置为false,如下例所示:
@Column({
type: 'jsonb',
array: false,
default: () => "'[]'",
nullable: false,
})
public users!: Array<{ id: string }>;
当不设置typeorm时,自动推断postgres列类型为jsonb[]
(而不是普通jsonb
),这不允许执行jsonb_set
操作。
发布于 2022-04-04 10:01:37
@Column('simple-array', { nullable: true })
toId!: string[];
https://stackoverflow.com/questions/59437390
复制相似问题