由于 jsonb 数据类型特定于 PostgreSQL,您将需要使用 Postgres 特定的原始 SQL。
TypeOrm 文档中的raw-sql-support 解释了如何使用原始 SQL 进行更新。例如:
await getConnection()
.createQueryBuilder()
.update(User)
.set({ jsonbColumn: () => "raw SQL jsonb function here" })
.where("id = :id", { id: 2 })
.execute();
关于如何替换部分jsonb数据,参考PostgreSQL文档json functions and operators下的jsonb_set:
jsonb_set(jsonbColumn,'{first_name}','"new first name"')
把它放在一起,它看起来像这样:
let id = 2;
let pathText = '{first_name}';
let newValue = '"new first name"';
await getConnection()
.createQueryBuilder()
.update(User)
.set({ jsonbColumn: () => "jsonb_set(jsonbColumn," + pathText + ",'" + newValue + "')" })
.where("id = :id", { id: id })
.execute();
json 和 jsonb_set 需要的那些引号让这很尴尬,如果你的新名称包含嵌入的 " 或 ' 就会搞砸。