Как преобразовать объект JSON в строку MySQL? - PullRequest
0 голосов
/ 12 января 2019

Я хотел бы взять строку JSON, представляющую объект из стороннего API, и вставить ее в таблицу MySQL. Свойства объекта JSON соответствуют полям таблицы 1-к-1. В этой таблице / JSON-объекте есть несколько сотен столбцов. И в любой момент будет вставлено несколько десятков строк.

Я бы предпочел не делать огромную структуру. Но если мне нужно, то я бы предпочел не db.Prepare() оператор INSERT с несколькими сотнями "?". Но если бы мне пришлось, я бы предпочел не писать stmt.Exec() с несколькими сотнями параметров.

Есть ли хороший способ сделать это на Голанге? Или это будет крайне неэффективно?

1 Ответ

0 голосов
/ 12 января 2019

Используйте следующие данные с учетом допустимых имен полей базы данных 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...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...