Обработка динамических запросов (нельзя сканировать в структуру)

При использовании 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)
}

Для краткости, никакая проверка ошибок не выполняется на любых ошибках.

Другие вопросы по тегам