#go
#Вперед
Вопрос:
Мое приложение подключено к Maria Db на другом сервере, поэтому, как только я запускаю свой движок, он извлекает данные путем запроса в базу данных, что я пытаюсь сделать, так это то, что мое приложение запрашивает из базы данных каждые 5 секунд. Я только что завершил работу службы maria DB этим
service mariadb stop
После выполнения этого в моем приложении, где я выполняю запрос, выдается эта ошибка:
panic: runtime error: invalid memory address or nil pointer dereference
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x54c9a6]
goroutine 50 [running]:
database/sql.(*Rows).close(0x0, 0x0, 0x0, 0x0, 0x0)
/home/go1.14/go/src/database/sql/sql.go:3063 0x76
database/sql.(*Rows).Close(0x0, 0x0, 0x0)
/home/go1.14/go/src/database/sql/sql.go:3059 0x33
panic(0x8d03e0, 0xf3dd00)
/home/go1.14/go/src/runtime/panic.go:969 0x166
database/sql.(*Rows).Next(0x0, 0x1)
/home/go1.14/go/src/database/sql/sql.go:2744 0x30
path-to-file/loadConfig.LoadFromDB(0x9ff760, 0xc0000240a0, 0xc000192000, 0xf, 0x0, 0x0, 0x0, 0x0)
path-to-file/loadConfig/loadConfig.go:65 0x1a2
Мой код выглядит следующим образом:
func LoadFromDB(Ctx context.Context, Conn *sql.DB, modId int) (map[string][]string, map[string]string, error) {
rows, err := Conn.Query(getQueryFromFile("QUERY"),modId)
if err != nil {
log.Println("LOAD CONFIG: Error establishing connection to DB")
}
defer rows.Close()
configValues := make(map[string][]string)
configTimeVal := make(map[string]string)
for rows.Next() {
configParam := ""
configVal := ""
var configLastUpdated string
eror := rows.Scan(amp;configParam, amp;configVal, amp;configLastUpdated)
if eror != nil {
return nil, nil, eror
} else {
configValues[configParam] = append(configValues[configParam], configVal)
configTimeVal[configParam] = configLastUpdated
}
}
return configValues, configTimeVal, nil
}
Можете ли вы, ребята, помочь мне в том, как справиться с этой ситуацией, когда служба maria db остановлена
Комментарии:
1. Не продолжайте работу с ошибкой из
Query
и проверяйтеrows.Err()
каждую итерацию. Смотрите пример в документах2. хорошо. Понял, спасибо
Ответ №1:
Вы пропускаете return
, когда ошибка не равна нулю, поэтому функция просто продолжает работать. Попробуйте это:
if err != nil {
log.Println("LOAD CONFIG: Error establishing connection to DB")
return nil, nil, err
}
Вам также необходимо обрабатывать ошибки из Next()
функции; смотрите Документы:
Далее подготавливает следующую строку результатов для чтения с помощью метода сканирования. При успешном завершении возвращает значение true или false, если следующей строки результатов нет или произошла ошибка при ее подготовке. Следует обратиться к Err, чтобы провести различие между этими двумя случаями.
Комментарии:
1. Хорошо, я пропустил это. Спасибо 🙂