当前位置: 首页 > 知识库问答 >
问题:

如何通过postgresql中的“typeorm”部分更新jsonb字段?

广宏远
2023-03-14

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

{
firstName: xx,
lastName: xxx
}

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

共有2个答案

微生欣怡
2023-03-14

只是添加到以前的答复:如果你想添加新的领域,你也可以尝试:

let keyName:string = '{key2}'
let valueName:string = '"new_value"'

emailLog: () => "jsonb_set(cast(email_log as jsonb), '" + keyNAme + "','" + valueName + "'," + "true" + ")"
殳毅
2023-03-14

因为jsonb数据类型是PostgreSQL特有的,所以您需要使用Postgres特有的原始SQL。

如何使用原始SQL进行更新在TypeOrm留档的raw-sql-support下进行了说明。例如:

    await getConnection()
        .createQueryBuilder()
        .update(User)
        .set({ jsonbColumn: () => "raw SQL jsonb function here" })
        .where("id = :id", { id: 2 })
        .execute(); 

关于如何替换部分jsonb数据,请参考PostgreSQL文档中json函数和运算符下的< code>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所需的引号使这一点非常尴尬,如果您的新名称包含嵌入的“或”,则会搞糟。

 类似资料:
  • 具有以下数据模型: 我需要将所有价格键更新为新名称cost。在静态字段上很容易做到这一点,使用: 结果: 但是我也需要在分解数组中做这些。 在不知道细分数组中的项目数的情况下,我如何做到这一点?换句话说,我如何在jsonb数组的每个元素上应用函数。 非常感谢。

  • 在我的Java项目中,我是usinq、JOOQ,我希望更新JSONB值。但我的建造失败了。 我写了一段代码: 我收到了下一条信息: 我犯错的地方?

  • 我有带有jsonb字段的postgresql,该字段总是包含数组。我需要将新值追加到该数组或通过索引更新已经存在的值。 看起来函数符合我的要求。对于追加新元素,我只需要最大数组索引并用它更新元素。但我做这个有点麻烦。让我们一步一步来。我们有使用jsonb字段team_members的表活动。 很好,如果静态设置路径“{0}”,则一切正常。让我们动态地做这件事 用于获取数组长度的SQL(它是appe

  • 如何更新JSONB以将新键添加到所有记录的嵌套数组(用于数组的所有项目)中。 我指的是表结构的链接: 给定的json是: 要将新元素添加到每个数组项中,请执行以下查询: 执行上述查询后输出: 但是上面只会在id=1的地方更新json。对于orders中的所有行,需要进行哪些更改才能更新与上述相同的JSON?

  • 问题内容: 正在运行。 下面给出的是我 巨大和丑陋 的样本 __ 我需要创建一个最终 结果 。 在执行上述操作时,出现以下错误。 我知道在做坏事。 希望您能从上述 查询中 了解要实现的目标。 因此,请提出其他替代方法。 非常感谢您的答复。 注意:实际查询 问题答案: 你不能那样做。 一个可以不引用PostgreSQL中CTE来看,由于热膨胀系数被物化。它们不仅是基础数据的视图。(有时确实很烦人,但

  • 我正在尝试使用TypeORM将多个JSON数据插入到一个名为integration_data的表中。我的应用程序使用NodeJS。但是不知何故,我无法使用TypeORM形成查询,以在PostgresSQL中对我的JSON数据执行批量UpSert。 以下是我的逻辑:- 在这里,我传递的是原始数据,它是一个 JSON 对象数组。 实体:- 这里,integration_data表中的emp_data列