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

如何将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

我想从第三方API获取一个表示对象的JSON字符串,并将其插入MySQL表中。JSON对象属性与表字段1对1匹配。这个表/JSON对象中有几百列。任何时候都会有几十行需要插入

我不想做一个巨大的结构。但是如果我需要,那么我宁愿不要
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。我对这不是类型安全的理解正确吗?我需要使用结构来保证类型安全?我可能会就此提出一个单独的问题