You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM结合Postgres:如何向jsonb数组追加对象?

解决Postgres中jsonb数组追加元素的问题

错误根源分析

你的代码存在几个关键问题:

  1. 混淆字段类型:实体定义type: 'jsonb'意味着字段存储的是JSON格式的数组(属于jsonb类型),而非Postgres原生的jsonb[]数组类型,array_append是操作Postgres原生数组的函数,不适用于jsonb内部的JSON数组。
  2. 列引用错误:原代码中'users'是字符串字面量,不是列名引用,Postgres无法识别为表字段。
  3. JSON语法错误:JSON字面量未用单引号包裹,Postgres会将{解析为语法起始符,导致语法报错。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:27:31