我想从第三方API中获取代表对象的JSON字符串,并将其插入MySQL表中。 JSON对象属性与表字段1-to-1匹配。该表/ JSON对象中有几百列。并且随时可以插入几十行。
我不想做一个庞大的结构。但是,如果需要的话,我宁愿不要db.Prepare()
带有几百个“?”的INSERT语句。但是如果需要的话,我宁愿不必编写带有数百个参数的stmt.Exec()
。
在golang中有没有很好的方法?还是只是效率极低?
答案 0 :(得分:1)
使用以下给定的有效数据库字段名称fieldNames
和JSON数据data
的一部分:
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注入攻击,从一片已知的列名开始工作很重要。
您可以查询数据库以创建fieldNames
切片。请参阅Get table column names in MySQL?了解所需查询。
如果列名和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...)