如何将JSON对象转换为MySQL行?

时间:2019-01-12 00:17:52

标签: mysql sql json go struct

我想从第三方API中获取代表对象的JSON字符串,并将其插入MySQL表中。 JSON对象属性与表字段1-to-1匹配。该表/ JSON对象中有几百列。并且随时可以插入几十行。

我不想做一个庞大的结构。但是,如果需要的话,我宁愿不要db.Prepare()带有几百个“?”的INSERT语句。但是如果需要的话,我宁愿不必编写带有数百个参数的stmt.Exec()

在golang中有没有很好的方法?还是只是效率极低?

1 个答案:

答案 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...)