【问题标题】:How can I update a jsonb field partially via `typeorm` in postgresql?如何通过 postgresql 中的“typeorm”部分更新 jsonb 字段?
【发布时间】:2021-06-07 02:59:49
【问题描述】:

我正在使用typeorm (https://github.com/typeorm/typeorm) 作为 ORM 库来连接到 postgresql 数据库。我将几列保存为jsonb 类型。现在我需要部分支持更新一个json数据,例如,

{
firstName: xx,
lastName: xxx
}

如果我只更新firstName,我不想在更新语句中覆盖lastName。 postgresql 支持json_set,我可以使用它来部分更新该字段,但是如何使它与typeorm libraray 一起使用?

【问题讨论】:

    标签: node.js postgresql typeorm


    【解决方案1】:

    由于 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 需要的那些引号让这很尴尬,如果你的新名称包含嵌入的 " 或 ' 就会搞砸。

    【讨论】:

      【解决方案2】:

      只是添加到上一个回复: 如果您也想添加新字段,您可以尝试:

      let keyName:string = '{key2}'
      let valueName:string = '"new_value"'
      
      emailLog: () => "jsonb_set(cast(email_log as jsonb), '" + keyNAme + "','" + valueName + "'," + "true" + ")"
      

      【讨论】:

        猜你喜欢
        • 2022-08-23
        • 2021-02-12
        • 2015-07-16
        • 1970-01-01
        • 2021-03-16
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多