如何将JSON对象转换为MySQL行?
我想从第三方API获取一个表示对象的JSON字符串,并将其插入MySQL表中。JSON对象属性与表字段1对1匹配。这个表/JSON对象中有几百列。任何时候都会有几十行需要插入 我不想做一个巨大的结构。但是如果我需要,那么我宁愿不要如何将JSON对象转换为MySQL行?,mysql,sql,json,go,struct,Mysql,Sql,Json,Go,Struct,我想从第三方API获取一个表示对象的JSON字符串,并将其插入MySQL表中。JSON对象属性与表字段1对1匹配。这个表/JSON对象中有几百列。任何时候都会有几十行需要插入 我不想做一个巨大的结构。但是如果我需要,那么我宁愿不要db.Prepare()一个包含几百个“?”的INSERT语句。但是,如果必须这样做,我不希望编写一个包含数百个参数的stmt.Exec() 在golang有这样做的好方法吗?或者它会非常低效吗?使用以下给定的有效数据库字段名字段名和JSON数据数据: var j ma
db.Prepare()
一个包含几百个“?”的INSERT语句。但是,如果必须这样做,我不希望编写一个包含数百个参数的stmt.Exec()
在golang有这样做的好方法吗?或者它会非常低效吗?使用以下给定的有效数据库字段名
字段名和JSON数据数据:
var j map[string]interface{}
if err := json.Unmarshal(data, &j); err != nil {
// handle error
}
var names []string
var inserts []string
var values []interface{}
for _, n := range fieldNames {
if v, ok := j[n]; ok {
names = append(names, n)
inserts = append(inserts, "?")
values = append(values, v)
}
}
statement := "insert into yourTable (" +
strings.Join(names, ", ") +
") values (" + strings.Join(inserts, ", ") + ")"
err := db.Exec(statement, values...)
为了避免SQL注入攻击,从已知列名的一部分开始工作是很重要的
您可以查询数据库以创建字段名
切片。有关所需的查询,请参阅
如果列名和JSON名称不同,则将切片替换为键为列名、值为JSON名称的映射:
fieldNames := map[string]string{
"column1": "json1",
... and so on
}
var j map[string]interface{}
if err := json.Unmarshal(data, &j); err != nil {
// handle error
}
var names []string
var inserts []string
var values []interface{}
for dbName, jsonName := range fieldNames {
if v, ok := j[jsonName]; ok {
names = append(names, dbName)
inserts = append(inserts, "?")
values = append(values, v)
}
}
statement := "insert into yourTable (" +
strings.Join(names, ", ") +
") values (" + strings.Join(inserts, ", ") + ")"
err := db.Exec(statement, values...)
所以,我仍然需要创建一个包含字段名的fieldNames
?这不可能是斯内克的案子(因为他们就是这样的)?不管我怎么做,谢谢你给我展示了一些我不知道的有趣的方法。上面的代码适用于snake_案例名称。唯一的要求是JSON属性名与表字段名匹配。查询数据库以获取字段名。有关要使用的查询的示例,请参阅。谢谢,我对您的示例进行了扩展以满足我的需要。具体来说,我使用了一个开关来处理不同的字段。我可能稍后发布代码,但我需要删除IP。我对这不是类型安全的理解正确吗?我需要使用结构来保证类型安全?我可能会就此提出一个单独的问题