登录
首页 >  Golang >  Go问答

使用 Go 在 Postgres 的 jsonb_set 函数中更新 JSONB 参数

来源:stackoverflow

时间:2024-02-23 13:24:26 362浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《使用 Go 在 Postgres 的 jsonb_set 函数中更新 JSONB 参数》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我正在使用 go 和 "github.com/jackc/pgx/v4/pgxpool"

我的表中的一个字段有 json,我需要在一个查询中更新两个键。

第一个问题是一次更新多个键,但我认为现在使用嵌套的 jsonb_set 可以正常工作。

一个更大的问题是参数替换在这种情况下如何工作。

update my_table
    set 
        first_column=$2,
        json_column = jsonb_set(jsonb_set(
                     json_column::jsonb, 
                    '{first_key_name}', 
                     $3,
                     true), 
                '{second_key_name}', 
                $4,
                true),
        updated_at  = now() at time zone 'utc'
    where id=$1

但是,这会产生 json 类型的 invalid 输入语法错误。在参数($3、$4)周围/之后添加 to_jsonb()::jsonb 没有帮助。

下面是如何使用 pgx 库将参数传递给查询。两个键值都是string类型。

err := pool.queryrow(ctx, myquery,
        id,
        first_column,
        first_key_value,
        second_key_value
    ).
        scan(...)

经过一些实验,似乎使其工作的一种方法是使用 jsonb_build_array 然后获取第 0 项。这看起来完全不可读,我几乎确信一定有一种更简单的方法来实现这一点。

UPDATE my_table
    SET 
        first_column=$2,
        json_column = JSONB_SET(JSONB_SET(
                     json_column::jsonb, 
                    '{first_key_name}', 
                     jsonb_array_element(jsonb_build_array($3::text), 0), 
                     true), 
                '{second_key_name}', 
                jsonb_array_element(jsonb_build_array($4::text), 0),
                true),
        updated_at  = now() at time zone 'utc'
    WHERE id=$1

正确答案


您可以在此处使用 || 运算符。 最初我们假设记录如下所示:

{"a":"b","key2":"value2"}

更新后

update dummy set j=j::jsonb||'{"a": "new_value"}
{"a":"new_value","key2":"value2"}

请记住,如果找到,它会替换顶级密钥,否则会创建新密钥。使用 jsonb_build_object 在 || 右侧创建 json 对象运算符

好了,本文到此结束,带大家了解了《使用 Go 在 Postgres 的 jsonb_set 函数中更新 JSONB 参数》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>