Обработка динамических запросов (нельзя сканировать в структуру)
При использовании go-pg, где структура запросов статична - запрос / сканирование непосредственно в известную структуру работает как сон. Но я изо всех сил пытаюсь обрабатывать динамические запросы - те, где нет структуры для сканирования.
Например, в зависимости от некоторых параметров времени выполнения - запросы могут выглядеть так:
select foo from table
или это может быть
select foo,bar,baz from table1
или же
select x,y,z from table2
Я пытался выяснить, как использовать загрузку результатов в карту. Код ниже выдает ошибку "недопустимый символ", ищущий начало значения "
m := make(map[string]interface{})
_,err:=db.Query(&m, "select foo,bar from table1")
if err!=nil{
fmt.Println(err)
}
Я только начинаю учиться идти - и я полностью потерян. Любые советы о том, как обрабатывать динамические запросы
1 ответ
Вы можете достичь этого, сначала отсканировав значения строки базы данных в срез, а затем построив карту, содержащую значения строки.
Вот пример, где результаты запроса сканируются в виде фрагмента указателей на переменные типа interface{}.
sql := "select foo,bar from table1"
rows, err := db.Query(sql)
columns, err := rows.Columns()
// for each database row / record, a map with the column names and row values is added to the allMaps slice
var allMaps []map[string]interface{}
for rows.Next() {
values := make([]interface{}, len(columns))
pointers := make([]interface{}, len(columns))
for i,_ := range values {
pointers[i] = &values[i]
}
err := rows.Scan(pointers...)
resultMap := make(map[string]interface{})
for i,val := range values {
fmt.Printf("Adding key=%s val=%v\n", columns[i], val)
resultMap[columns[i]] = val
}
allMaps = append(allMaps, resultMap)
}
Для краткости, никакая проверка ошибок не выполняется на любых ошибках.