1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/dana-go-database-sql-tutorial-translation

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
09.0.varcols.md 2.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.03.2025 18:11 571ab8e
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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/dana-go-database-sql-tutorial-translation.git
git@api.gitlife.ru:oschina-mirror/dana-go-database-sql-tutorial-translation.git
oschina-mirror
dana-go-database-sql-tutorial-translation
dana-go-database-sql-tutorial-translation
master