首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeORM jsonb阵列列

TypeORM jsonb阵列列
EN

Stack Overflow用户
提问于 2019-12-21 15:21:39
回答 2查看 28.4K关注 0票数 8

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

我正在尝试创建jsonb数组列,但我可能没有这样做。

Notes

  1. 我通常只需添加一个简单的额外实体和关系就可以完成这个任务。在这种情况下,我被要求使用oder中的jsonb类型来修改接口,而不必满足模式jsonb的要求--一个简单的索引ids列表现在已经足够了。
  2. --我不确定我是否应该使用array: true列选项。我尝试使用一个普通的jsonb对象,但没有成功( "{}"::jsonb )。

我的目标:

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

例如:

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

或者:

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

代码:

我的专栏定义:

代码语言:javascript
运行
复制
@Column({
        type: 'jsonb',
        array: true,
        default: () => 'ARRAY[]::jsonb[]',
        nullable: false,
    })
    public users: Array<{ id: string }> = [];

我设法获取空数组

代码语言:javascript
运行
复制
const group = await repo.findOneOrFail({ id: groupId });
console.log('>>>>>', group.users);

其中产出:

代码语言:javascript
运行
复制
>>>>> []

尝试将项添加到数组并按以下方式持久化时

代码语言:javascript
运行
复制
return repo.update(groupId, { users: [...group.users, { id: userId }] });

我得到以下输出:

代码语言:javascript
运行
复制
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似乎提供了一个普通的对象数组,同时需要一个不同的格式/表示法。我还没有在文档中找到关于这类场景的详细信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-21 22:40:59

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

代码语言:javascript
运行
复制
@Column({
        type: 'jsonb',
        array: false,
        default: () => "'[]'",
        nullable: false,
    })
    public users!: Array<{ id: string }>;

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

票数 26
EN

Stack Overflow用户

发布于 2022-04-04 10:01:37

代码语言:javascript
运行
复制
@Column('simple-array', { nullable: true })
  toId!: string[];
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59437390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档