我正在使用typeorm作为 ORM 库连接到 postgresql 数据库。我将几列保存为 jsonb 类型。现在我需要支持部分更新一个json数据,例如
{
firstName: xx,
lastName: xxx
}
如果我只更新firstName
,我不想在更新语句中覆盖lastName。 postgresql
支持 json_set
,我可以用它来部分更新字段,但如何使其与 typeorm
libraray 一起使用?
最佳答案
由于 jsonb 数据类型特定于 PostgreSQL,因此您将需要使用 Postgres 特定的原始 SQL。
raw-sql-support 中解释了如何使用原始 SQL 进行更新。在 TypeOrm 文档中。例如:
await getConnection()
.createQueryBuilder()
.update(User)
.set({ jsonbColumn: () => "raw SQL jsonb function here" })
.where("id = :id", { id: 2 })
.execute();
请参阅json functions and operators下的jsonb_set
在 PostgreSQL 文档中了解如何替换部分 jsonb 数据:
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 所需的引号使这非常尴尬,如果您的新名称包含嵌入的“或 ' ,它会搞砸。
关于node.js - 如何在 postgresql 中使用 typeorm 部分更新 jsonb 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66543212/