我正在使用typeorm
(https://github.com/typeorm/typeorm)作为ORM库来连接postgresql数据库。我将几列保存为jsonb
类型。现在我需要支持部分更新json数据,例如,
{
firstName: xx,
lastName: xxx
}
如果我只更新firstName
,我不想在更新语句中覆盖lastName。postgresql
支持json_set
,我可以使用它来部分更新字段,但我如何使它与typeorm
图书一起工作?
只是添加到以前的答复:如果你想添加新的领域,你也可以尝试:
let keyName:string = '{key2}'
let valueName:string = '"new_value"'
emailLog: () => "jsonb_set(cast(email_log as jsonb), '" + keyNAme + "','" + valueName + "'," + "true" + ")"
因为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来看,由于热膨胀系数被物化。它们不仅是基础数据的视图。(有时确实很烦人,但
我在一个结构中有一个固定大小的缓冲区,我想在它中间复制一些数据。 我现在唯一能看到的就是从开始的部分,加上我想要的,然后在最后加上部分,但是我确信这会导致一两个我想要避免的大副本,我只是需要更新中间的缓冲区。有没有一种简单的方法可以做到这一点而不使用不安全的代码?