как лучше всего обработать результат запроса select sql в go?
Контекст (вот что я получил до сих пор...):
@Обновлять
func (s *SQLServiceServer) select_query_func() {
// db_connection and validation
rows, err1 := db.Query(request.GetQuery())
if err1 != nil {
panic(err1)
}
defer rows.Close()
columns, err2 := rows.Columns()
if err2 != nil {
panic(err2)
}
// Loop through rows, using Scan to assign column data to struct fields.
for rows.Next() {
values := make([]interface{}, len(columns))
for i := range values {
values[i] = new(interface{})
}
if err2 = rows.Scan(values...); err2 != nil {
panic(err2)
}
for i := range values {
fmt.Println(values[i])
}
}
return requestOutput(REQUEST_OK, RESULT_OK, ERROR_NULL)
}
Подводя итог, как лучше всего это сделать?
Ошибка, которую я упомянул
Scan
требует выделенный, то есть ненулевых указателей в качестве аргументов. Допускаются следующие типы:
*string *[]byte *int, *int8, *int16, *int32, *int64 *uint, *uint8, *uint16, *uint32, *uint64 *bool *float32, *float64 *interface{} *RawBytes *Rows (cursor value) any type implementing Scanner (see Scanner docs)
Поэтому, чтобы исправить свой код, вам нужно заполнить срез values
ненулевыми указателями, и для ваших целей эти указатели могут быть типа *interface{}
.
for rows.Next() {
values := make([]interface{}, len(columns))
for i := range values {
values[i] = new(interface{})
}
if err := rows.Scan(values...); err != nil {
return err
}
}
@Lucosa Я пробовал это на своей машине, и все работает отлично, без проблем. Вы должны использовать rows.Scan(values...)
, без ...
это будем не работает. Пожалуйста, обновите вопрос, включив новый код, чтобы я мог посмотреть, правильно ли вы это делаете. А также включите сообщение об ошибке точный.
@Люкоса imgur.com/uxWyBgo
я только что изменил его :], кстати, я использую «go-sql-driver/mysql» в качестве драйвера, idk, если что-то с ним... @mkopriva
@Lucosa Это похоже на проблему с IDE. Попробуйте запустить код из терминала с помощью go build -o ./main && ./main
и посмотрите, пройдет ли он компиляцию.
@Lucosa Теперь я понимаю, что мой первоначальный ответ касается другой проблемы в вашем коде. Ошибка, которую показывает IDE, является ошибкой времени компиляции. Ошибка, на которую указывает ответ, является ошибкой времени выполнения. Вам все еще нужно решение в ответе, но оно не связано с ошибкой в вашем вопросе. Извини.
у меня все еще та же проблема, я понял, что указатель для сканирования должен быть ненулевым, однако я не могу сканировать таким образом. Я имею в виду, что я не могу сделать это: rows.Scan(values...) есть ошибка. Я пытался просто использовать rows.Scan(values), но это тоже сработало... (кстати, я полный нуб в golang) @mkopriva