【问题标题】:how to update few fields of jsonb in golang cockroachdb如何在golang cockroachdb中更新jsonb的几个字段
【发布时间】:2020-03-09 14:32:05
【问题描述】:

我在 cockroachdb 中有如下表格:

         key        |                          value                           
+-------------------+---------------------------------------------------------+
  <host_ipa>        | {“student_name": “John", “degree": “Bachelors”, “university”: “KU”, “Company”: “ABC"}  

现在我只想更新 jsonb - degreeuniversity 的两个键。我该怎么做?

我有一个解决方案,但需要提供所有四个字段。

这是我在 golang 中的内容:

sqlCmd := fmt.Sprintf(" UPDATE %v set value = json_object('{%v, %v, %v, %v}'::string[], '{%v, %v, %v, %v}'::string[]) WHERE key = '%v' ",
        myTable,
        strconv.Quote("student_name”),
        strconv.Quote("degree"),
        strconv.Quote(“university”),
        strconv.Quote("Company"),
        strconv.Quote(student),
        strconv.Quote(newDegree),
        strconv.Quote(newUniversity),
        strconv.Quote(company),
        host)
    db, err := sql.Open(dbDriver, DBConnStr)
    _, err = db.Exec(sqlCmd)

基于@Bergi 的工作解决方案:

    db, err := sql.Open(dbDriver, DBConnStr)    
    sqlCmd := "UPDATE " + myTable + " SET value = value || jsonb_build_object(‘degree', $1::string, ‘university', $2::string) WHERE key = $3"
    _, err = db.Exec(sqlCmd, newDegree, newUniversity, host)

【问题讨论】:

  • 我假设您的实际代码没有引号问题(vs'vs")?

标签: go jsonb cockroachdb


【解决方案1】:

要更新 jsonb 对象的单个属性,请使用 jsonb_set

UPDATE myTable SET value = jsonb_set(value, '{degree}', $1::text) WHERE key = $2

您可以嵌套调用以进行多次更新:

UPDATE myTable SET value = jsonb_set(jsonb_set(value, '{degree}', $1::text), '{university}', $2::text) WHERE key = $3

或者,您也可以简单地使用the || operator 将新值合并到对象中:

UPDATE myTable SET value = value || jsonb_build_object('degree', $1::text, 'university', $2::text) WHERE key = $3

【讨论】:

  • 我喜欢the || operator 解决方案。但我遇到了不同的错误(用新代码编辑了我的帖子)。
  • 嗯,当你硬编码这些值时它是否有效?我不确定 Go 中的参数化查询是如何工作的。
  • 是的,硬编码值确实有效(我尝试使用 fmt.Sprintf())。但是参数化的值似乎避免了 SQL 注入,所以我倾向于它。我也尝试过传递“字符串”之类的参数,但没有成功。
  • 嗯,根据this article,你做的一切都是对的......
  • 我确实在节点上启用了 cockroachdb sql 日志记录。我可以很快看到这个问题。 @Bergi,您的建议非常完美 - jsonb 属性需要指定类型,在我的情况下是 $1::string and $2::string$1::text and $2::text
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2015-10-06
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多