【发布时间】: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