node.js - 如何在 postgresql 中使用 typeorm 部分更新 jsonb 字段?

标签 node.js postgresql typeorm

我正在使用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/

相关文章:

javascript - BUG 导出的对象在修改时不会在外部发生变化

typescript - typeorm 在 jsonb 列属性上添加索引

javascript - Sequelize.js findAll 与包含搜索外键使页面永远不会加载

linux - CentOS 错误 - sudo : effective uid is not 0, 是 sudo 安装 setuid root 吗?

sql - 查询 WITH 子句错误

postgresql - 在Rust中将时间戳吸收到postgres时,如何避免字符串转换?

sql - Ruby on Rails - 动态 SQL 查询

typescript - 如何向此关系插入关注者

javascript - typescript & TypeORM : Cannot use import statement outside a module

javascript - 锯齿波 Javascript SDK