Используйте следующие данные с учетом допустимых имен полей базы данных 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
. См. Получить имена столбцов таблицы в 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...)