TypeORM结合Postgres:如何向jsonb数组追加对象?
解决Postgres中jsonb数组追加元素的问题
错误根源分析
你的代码存在几个关键问题:
- 混淆字段类型:实体定义
type: 'jsonb'意味着字段存储的是JSON格式的数组(属于jsonb类型),而非Postgres原生的jsonb[]数组类型,array_append是操作Postgres原生数组的函数,不适用于jsonb内部的JSON数组。 - 列引用错误:原代码中
'users'是字符串字面量,不是列名引用,Postgres无法识别为表字段。 - JSON语法错误:JSON字面量未用单引号包裹,Postgres会将
{解析为语法起始符,导致语法报错。 - SQL注入风险:直接拼接JSON字符串存在安全隐患。
正确解决方案
根据你的字段类型(jsonb存储JSON数组),推荐以下两种安全的追加方式:
方法1:使用||操作符(Postgres 9.5+支持,推荐)
||操作符可直接将单个jsonb元素追加到jsonb数组末尾:
await this.entityManager.getRepository(Project) .createQueryBuilder('project') .update() .set({ users: () => `project.users || :user::jsonb` }) .setParameter('user', JSON.stringify({ name: user.firstname })) .where('project.id = :id', { id: 你的项目ID }) // 必须添加WHERE条件,避免更新全表 .execute();
方法2:使用jsonb_insert函数
如果需要精确控制插入位置,可使用jsonb_insert,最后一个参数true表示允许插入到数组末尾:
await this.entityManager.getRepository(Project) .createQueryBuilder('project') .update() .set({ users: () => `jsonb_insert(project.users, '{0}', :user::jsonb, true)` }) .setParameter('user', JSON.stringify({ name: user.firstname })) .where('project.id = :id', { id: 你的项目ID }) .execute();
若字段为Postgres原生jsonb[]数组类型
如果你的实体字段实际定义为type: 'jsonb[]'(Postgres原生数组),修正原代码如下:
await this.entityManager.getRepository(Project) .createQueryBuilder('project') .update() .set({ users: () => `array_append(project.users, :user::jsonb)` }) .setParameter('user', JSON.stringify({ name: user.firstname })) .where('project.id = :id', { id: 你的项目ID }) .execute();
重要提醒:无论哪种写法,都必须添加
WHERE条件,否则会更新表中所有Project记录的users字段!
内容的提问来源于stack exchange,提问作者BeginnerDev
相关产品推荐
相关产品推荐

