簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM