首页 > 解决方案 > 我需要在 Postgres JSONB 列中的对象字段中附加一组对象

问题描述

注意:我对 SQL 没有太多经验。

我有一个darf有两列uid的表forms

forms列是 postgres jsonb 类型。我将存储在uid名称/电子邮件字符串中,在forms列中我将 go 结构存储为 JSONB 类型

type Forms struct {
  External []FormExternal
  Internal []FormInternal
  Download []FormDownloadPurchaseBU
  Purchase []FormDownloadPurchaseBU
  BU       []FormDownloadPurchaseBU
}

利用这个功能

func (f Forms) Value() (driver.Value, error) {
    return json.Marshal(f)
}

我使用这样的查询插入我的第一行

func (db DB) InitialInsertQuery(email string, forms form.Forms) {
  initInsertQuery := "INSERT INTO darf (uid,forms) VALUES ($1, $2)"
  _ , err := db.Conn.Exec(initInsertQuery, email, forms)
}

我现在在我的表中有一个条目,我想将一个对象/结构添加到 forms列对象 中的 Arrays[] 之一{"External": null, "Internal": null, "Download": [{...}], "Internal": null, "BU": null, "Purchase": null, }

首先,当我初始化一个新用户时,我不希望其他字段为空......我将如何改变它?

其次,我的主要问题是如何在 jsonbforms列对象字段中附加“下载”或任何数组?我显然想在 Go 中做到这一点。但是我有 PG Admin4 只是想先了解 SQL 查询本身,甚至做这样的事情。我发现了一些类似的东西

UPDATE darf SET darf.forms.Download = darf.forms.Download || '{...}' ::jsonb WHERE uid='useremail'

或者我也遇到了一些 jsonb_set(\something) 但是我也希望它在 Go 中并尝试传递一个表单以添加到 jsonb 对象中的一个数组中。

我最终试图做这样的事情

func (db DB) InsertOneFormQuery(email string, form form.FormDownloadPurchaseBU) {
  initInsertQuery := "UPDATE darf APPEND darf.forms.Download VALUES ($1) WHERE uid=$2"
  _ , err := db.Conn.Exec(initInsertQuery, form, email)
}

任何见解都会令人惊叹,甚至是文档或链接。

标签: sqldatabasepostgresqlgojsonb

解决方案


推荐阅读