[英]How can I update a jsonb field partially via `typeorm` in postgresql?
我正在使用typeorm
( https://github.com/typeorm/typeorm ) 作為 ORM 庫來連接到 postgresql 數據庫。 我將幾列保存為jsonb
類型。 現在我需要部分支持更新 json 數據,例如,
{
firstName: xx,
lastName: xxx
}
如果我只更新firstName
,我不想在更新語句中覆蓋 lastName 。 postgresql
支持json_set
,我可以使用它來部分更新字段,但我怎樣才能使它與typeorm
libraray 一起使用?
由於 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 數據,請參考jsonb_set
文檔中json 函數和運算符下的 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 所需的那些引號使這非常尷尬,如果您的新名稱包含嵌入的 " 或 ' 它會搞砸。
只需添加上一個回復:如果您也想添加新字段,您可以嘗試:
let keyName:string = '{key2}'
let valueName:string = '"new_value"'
emailLog: () => "jsonb_set(cast(email_log as jsonb), '" + keyNAme + "','" + valueName + "'," + "true" + ")"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.