pq QueryRow Scan завершается неудачно с неверным адресом памяти или разыменованием нулевого указателя - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующая функция, которая должна извлекать одну строку из моей таблицы идей:

func (s *IdeaService) GetIdea(id int64) (*ideaservice.Idea, error) {
    stmt, err := s.DB.Prepare("SELECT id, name, description, created_on, last_updated FROM ideas WHERE id = $1")
    if err != nil {
        return nil, err
    }
    defer stmt.Close()
    var idea *ideaservice.Idea
    err = stmt.QueryRow(id).Scan(&idea.ID, &idea.Name, &idea.Description, &idea.CreatedOn, &idea.LastUpdated)
    return idea, err
}

Когда я запускаю это в тесте, возникает следующая ошибка:

--- FAIL: TestGetIdea (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
    panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x65be98]

Я не могу понять проблему. Я полагаю, что я правильно описал идею var как указатель, которому затем присваиваю значения в методе Scan. У кого-нибудь есть предложения?

1 Ответ

0 голосов
/ 17 апреля 2020
func (s *IdeaService) GetIdea(id int64) (*ideaservice.Idea, error) {
    stmt, err := s.DB.Prepare("SELECT id, name, description, created_on, last_updated FROM ideas WHERE id = $1")
    if err != nil {
        return nil, err
    }
    defer stmt.Close()
    var idea *ideaservice.Idea
    err = stmt.QueryRow(id).Scan(&idea.ID, &idea.Name, &idea.Description, &idea.CreatedOn, &idea.LastUpdated)
    return idea, err
}

Не могли бы вы заменить $1 на ? и посмотреть, работает ли он? В stmt.QueryRow вы передаете id. Например:

stmt, err := s.DB.Prepare("SELECT id, name, description, created_on, last_updated FROM ideas WHERE id = ?")

Если это не сработает, добавьте этот блок:

switch {
    case err == sql.ErrNoRows:
        log.Fatalf("no user with id %d", id)
    case err != nil:
        log.Fatal(err)
    default:
        log.Println("ok!")
    }

ОБНОВЛЕНИЕ: Не видел комментариев к вопросу. Да, он тоже прав. Также исправьте их.

И проверьте, где находится err (в этом случае).

...