layout | title |
---|---|
article |
Работа с неизвестными столбцами |
Функция Scan()
требует передачи точно правильного количества целевых переменных. А что делать, если вы не знаете, какие столбцы вернет запрос?
Если вы не знаете, сколько столбцов вернет запрос, можно использовать Columns()
, чтобы получить список названий столбцов. Вы можете проверить длину этого списка, чтобы узнать количество столбцов, а затем передать слайс в Scan()
с правильным количеством значений. Например, некоторые форки MySQL возвращают различные столбцы для команды SHOW PROCESSLIST
, поэтому вам следует подготовиться к этому, чтобы избежать ошибок. Вот один способ сделать это; есть и другие:
cols, err := rows.Columns()
if err != nil {
// Обработка ошибки
} else {
dest := []interface{}{
new(uint64), // id
new(string), // host
new(string), // user
new(string), // db
new(string), // command
new(uint32), // time
new(string), // state
new(string), // info
}
if len(cols) == 11 {
// Сервер Percona
} else if len(cols) > 8 {
// Обработка этого случая
}
err = rows.Scan(dest...)
// Работа со значениями в dest
}
Если вы не знаете столбцы или их типы, следует использовать sql.RawBytes
.
cols, err := rows.Columns() // Не забудьте проверять err после вызова
vals := make([]interface{}, len(cols))
for i, _ := range cols {
vals[i] = new(sql.RawBytes)
}
for rows.Next() {
err = rows.Scan(vals...)
// Теперь вы можете проверить каждый элемент vals на наличие nil,
// и использовать рефлексию типа и утверждение типа, чтобы загрузить столбец в переменную с указанным типом.
}
Предыдущий: Работа с NULL Следующий: Коннект-пул
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )