【问题标题】:Inserting string into jsonb type postgres将字符串插入 jsonb 类型的 postgres
【发布时间】:2019-12-04 07:59:58
【问题描述】:

我有一个函数可以为批量插入到 postgres 中生成一个准备好的语句,我试图将字符串插入到 postgres 中的 jsonb 类型中。

我的结构看起来像:

type struct1 struct {
id int
comment string
extra string
}

我的表架构如下所示:

create table deal (
id bigserial,
comment varchar(75),
extra jsonb
)

我想将 []struct1 转储到 Postgres DB“交易”。

生成准备好的语句的函数如下所示:

func BulkInsert(str []struct1, ctx context.Context) string {
    log.Debug("inserting records to DB")
    query := fmt.Sprintf(`insert into deal (%s) values `, strings.Join(dbFields, ","))
    var numFields = len(dbFields)
    var values []interface{}
    for i, database := range str {
        values = append(values, database.Comment,`'`+database.Extra+`'`)
        n := i * numFields
        query += `(`
        for j := 0; j < numFields; j++ {
            query += `$` + strconv.Itoa(n+j+1) + `,`
        }
        query = query[:len(query)-1] + `),`
    }
    query = query[:len(query)-1]
        return query

预期的结果应该是:我应该能够将字符串插入 json 或者您可以说将字符串转换为 json 并转储它。

实际结果是: could not save batch: pq: invalid input syntax for type json"

【问题讨论】:

  • 你试过`'`+database.Extra+`'::jsonb`吗? database.Extra 是否持有有效的 json 格式?
  • 是的,但是 database.Extra 可以是可选的,所以我有时可能会得到它,也可能不会。而'`+database.Extra+`'::jsonb 不工作我试过了
  • 一个空的''(单引号字符串)是无效 json。因此,如果 extra 为空,则必须提供“一些” json,例如'{}',或'""'
  • 另外,我的第一条评论是错误的。需要时,::jsonb 应附加到参数引用 ($2::jsonb) 而不是参数本身。
  • @mkopriva 成功了。我喜欢你弹奏弦乐的方式。干杯!!

标签: postgresql go


【解决方案1】:

json_build_array('exp1'::Text, 'exp2'::Text) 的功能可能会对您有所帮助。

返回 json 对象:{'exp1', 'exp2'}

并提取值只需使用运算符-&gt;&gt;&lt;index&gt; 就像-&gt;&gt;1 来获取'exp2'。

如果你只是想插入数据库,to_json('any element') 的功能也应该可以,它可以将任何元素转换为 json 对象。

你可以在postgres document获得更多关于json(jsonb)的功能。

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多