Golang: как правильно обрабатывать запрос динамического выбора

как лучше всего обработать результат запроса 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)
}

Подводя итог, как лучше всего это сделать?

Ошибка, которую я упомянул

Golang: как правильно обрабатывать запрос динамического выбора

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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
    }
}

у меня все еще та же проблема, я понял, что указатель для сканирования должен быть ненулевым, однако я не могу сканировать таким образом. Я имею в виду, что я не могу сделать это: rows.Scan(values...) есть ошибка. Я пытался просто использовать rows.Scan(values), но это тоже сработало... (кстати, я полный нуб в golang) @mkopriva

Lucosa 08.04.2022 17:07

@Lucosa Я пробовал это на своей машине, и все работает отлично, без проблем. Вы должны использовать rows.Scan(values...), без ... это будем не работает. Пожалуйста, обновите вопрос, включив новый код, чтобы я мог посмотреть, правильно ли вы это делаете. А также включите сообщение об ошибке точный.

mkopriva 08.04.2022 17:11

@Люкоса imgur.com/uxWyBgo

mkopriva 08.04.2022 17:18

я только что изменил его :], кстати, я использую «go-sql-driver/mysql» в качестве драйвера, idk, если что-то с ним... @mkopriva

Lucosa 08.04.2022 17:34

@Lucosa Это похоже на проблему с IDE. Попробуйте запустить код из терминала с помощью go build -o ./main && ./main и посмотрите, пройдет ли он компиляцию.

mkopriva 08.04.2022 17:35

@Lucosa Теперь я понимаю, что мой первоначальный ответ касается другой проблемы в вашем коде. Ошибка, которую показывает IDE, является ошибкой времени компиляции. Ошибка, на которую указывает ответ, является ошибкой времени выполнения. Вам все еще нужно решение в ответе, но оно не связано с ошибкой в ​​вашем вопросе. Извини.

mkopriva 08.04.2022 17:40

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