Проблема при обработке более 20 записей - PullRequest
0 голосов
/ 21 ноября 2019

Я использую библиотеку github.com/go-sql-driver/mysql для взаимодействия с моей базой данных MySQL. Все работает нормально, за исключением случаев, когда у меня запрос больше 20 записей. Запрос возвращает набор результатов в порядке, но когда цикл проходит через него, он паникует, когда добираюсь до 21-й записи.

Я запрашиваю свою базу данных следующим образом:

row, err = store.db.Query(myquerystring)

Я извлекаю возвращенные значениянапример:

indx = 0
for row.Next() {
    err = row.Scan(
       &mySlice[indx].Val1, &mySlice[indx].Val2
    )

    if err != nil {
        if err == sql.ErrNoRows {
            log.Print("No records found")
        } else {
            log.Printf("Error retrieving data: %s", err.Error())
        }
    } 
    indx++
}

Ошибка, которую я получаю, не связана с обработкой ошибок, она возникает сразу после получения 21-й записи. Я ставлю вход в систему в качестве первой и последней вещи в цикле for, и я получаю журнал для конца 20-й записи, но не первый журнал для 21-й записи, поэтому кажется, что строка for row.Next() вызывает панику.

Я получаю сообщение об ошибке:

http: panic serving xxx.xxx.xxx.xxx:xxxxx: runtime error: invalid memory address or nil pointer dereference

Вот как я инициализирую свой фрагмент:

** sqlstring - тот же запрос, что и выше, за исключением удаления всех полейиз выбора и только count(tableid) возвращается.

row, err := store.db.Query(sqlString)

row.Next()
err = row.Scan(
    &count,
)

var mySlice = make([]mystruct, count)

Трассировка стека:

web_1  | 2019/11/21 03:03:23 4) record number: 19
web_1  | 2019/11/21 03:03:23 http: panic serving xxx.xxx.xxx.xxx:xxxxx: runtime error: invalid memory address or nil pointer dereference
web_1  | goroutine 811 [running]:
web_1  | net/http.(*conn).serve.func1(0xc42047eaa0)
web_1  |        /usr/local/go/src/net/http/server.go:1721 +0xd0
web_1  | panic(0x7f8bc0, 0xa5c3a0)
web_1  |        /usr/local/go/src/runtime/panic.go:489 +0x2cf
web_1  | database/sql.(*Rows).Next(0x0, 0x87afa9)
web_1  |        /usr/local/go/src/database/sql/sql.go:2133 +0x30
web_1  | main.(*dbStore).GetVehicleCount(0xc420076230, 0x8865a0)
web_1  |        /go/src/app/store.go:1385 +0xa7
web_1  | main.(*dbStore).GetVehicles(0xc420076230, 0x0, 0x0, 0x0)
web_1  |        /go/src/app/store.go:1415 +0xed
web_1  | main.(*dbStore).SearchTrips(0xc420076230, 0xed5540400, 0x0, 0x0, 0x0, 0x0, 0x0)
web_1  |        /go/src/app/store.go:1220 +0x123
web_1  | main.CalendarReportHandler(0xa373e0, 0xc4200e3420, 0xc4200ce500)
web_1  |        /go/src/app/handlers.go:1559 +0x475
web_1  | net/http.HandlerFunc.ServeHTTP(0x886ca0, 0xa373e0, 0xc4200e3420, 0xc4200ce500)
web_1  |        /usr/local/go/src/net/http/server.go:1942 +0x44
web_1  | app/vendor/github.com/gorilla/mux.(*Router).ServeHTTP(0xc4200d4180, 0xa373e0, 0xc4200e3420, 0xc4200ce500)
web_1  |        /go/src/app/vendor/github.com/gorilla/mux/mux.go:212 +0xdf
web_1  | net/http.serverHandler.ServeHTTP(0xc42009bd90, 0xa373e0, 0xc4200e3420, 0xc4200ce300)
web_1  |        /usr/local/go/src/net/http/server.go:2568 +0x92
web_1  | net/http.(*conn).serve(0xc42047eaa0, 0xa37ae0, 0xc4203a9600)
web_1  |        /usr/local/go/src/net/http/server.go:1825 +0x612
web_1  | created by net/http.(*Server).Serve
web_1  |        /usr/local/go/src/net/http/server.go:2668 +0x2ce
web_1  | 2019/11/21 03:03:23 Error retrieving drivers: Error 1040: Too many connections
web_1  | 2019/11/21 03:03:23 http: panic serving 172.26.0.1:58770: runtime error: invalid memory address or nil pointer dereference
web_1  | goroutine 955 [running]:
web_1  | net/http.(*conn).serve.func1(0xc4204e9040)
web_1  |        /usr/local/go/src/net/http/server.go:1721 +0xd0
web_1  | panic(0x7f8bc0, 0xa5c3a0)
web_1  |        /usr/local/go/src/runtime/panic.go:489 +0x2cf
web_1  | database/sql.(*Rows).Next(0x0, 0x87afa9)
web_1  |        /usr/local/go/src/database/sql/sql.go:2133 +0x30
web_1  | main.(*dbStore).GetVehicleCount(0xc420076230, 0x0)
web_1  |        /go/src/app/store.go:1385 +0xa7
web_1  | main.(*dbStore).SearchTrips(0xc420076230, 0xed54d6c80, 0x0, 0x0, 0x0, 0x0, 0x0)
web_1  |        /go/src/app/store.go:1219 +0xf3
web_1  | main.CalendarReportHandler(0xa373e0, 0xc4200e3960, 0xc4200ce700)
web_1  |        /go/src/app/handlers.go:1559 +0x475
web_1  | net/http.HandlerFunc.ServeHTTP(0x886ca0, 0xa373e0, 0xc4200e3960, 0xc4200ce700)
web_1  |        /usr/local/go/src/net/http/server.go:1942 +0x44
web_1  | app/vendor/github.com/gorilla/mux.(*Router).ServeHTTP(0xc4200d4180, 0xa373e0, 0xc4200e3960, 0xc4200ce700)
web_1  |        /go/src/app/vendor/github.com/gorilla/mux/mux.go:212 +0xdf
web_1  | net/http.serverHandler.ServeHTTP(0xc42009bd90, 0xa373e0, 0xc4200e3960, 0xc420144000)
web_1  |        /usr/local/go/src/net/http/server.go:2568 +0x92
web_1  | net/http.(*conn).serve(0xc4204e9040, 0xa37ae0, 0xc4204e1940)
web_1  |        /usr/local/go/src/net/http/server.go:1825 +0x612
web_1  | created by net/http.(*Server).Serve
web_1  |        /usr/local/go/src/net/http/server.go:2668 +0x2ce

1 Ответ

0 голосов
/ 24 ноября 2019

Прежде всего, спасибо за запросы на трассировку стека, это заставило меня проанализировать трассировку стека с помощью зубного гребня, который привел меня к решению.

Было 2 проблемы.

Мойу функции для заполнения моего среза было две другие функции, которые вызывались для заполнения структур в моей родительской структуре, из-за того, что количество записей в родительской структуре возвращало значение, превышающее максимально допустимое количество соединений до заполнения родительской структуры. Явное закрытие объекта строки в этих функциях решило эту ошибку.

Вторым было то, что у меня был цикл for, где я был циклом от 1 до количества записей, потому что я хотел сохранить значение от 1 до "X" вместоот 0 до «X-1», но это, очевидно, привело к ошибке индекса вне диапазона (ошибка новичка). Это было легко решено простым циклом и сохранением «X + 1» в переменной.

Спасибо за все комментарии, которые помогли мне найти мои собственные проблемы, очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...