@nano_e_t_4

Как обрабатывать код ошибки к базе?

Всем привет

у меня есть такой код:
insert := fmt.Sprintf("insert into la (bla, data_time, kla) values (%d, now(), \"df\"')", ga)
    _, err := db.Exec(insert)
    if err != nil {
      fmt.Println(err)
    }


столбца kla в таблице нету, соответственно на консоль печатается ошибка. Мне нужен код ошибки, чтобы его обрабатывать. Рефлект говорит, что тип ошибки *pq.Error. гитхаб говорит что в этой структуре есть много полей, в том числе Code, Message.
Но при попытке обратится к этому полю выходит ошибка что таких полей нет
Как быть честно говоря и незаю.
Вообщем итого, хочу брать код ошибки, и обрабатывать его нужным образом. Но взять код ошибки не получается, потому что такого поля в структуре нет (
  • Вопрос задан
  • 201 просмотр
Решения вопроса 3
db.Exec возвращает интерфейс error, вам нужно его попробовать привести к *pq.Error, чтобы обработать.
_, err := db.Exec(insert)
if err != nil {
    if pgError,ok := err.(*pq.Error); ok {
        // Достаём код из переменной pgError
    } else {
        // Пришедший тип не является *pg.Error
    }
}


И самое главное!
НИКОГДА не используйте Sprintf для формирования запроса, вы открываете SQL Injection в вашем коде. Используйте возможность подстановки, которую даёт вам пакет database/sql
db.Query("select id, name from users where id = ?", 1) // Вот так, например
Ответ написан
Комментировать
astec
@astec
Разработчик https://debtstracker.io/
Вам нужен type assertion - приведение к типу.

if pqError, ok := err.(*pq.Error); ok {
...
}
Ответ написан
Комментировать
@RidgeA
Оно возвращает стандартную ошибку.
Надо привести к pg.Error

Как-то так:
https://github.com/lib/pq/blob/a6140c91df5fb930610...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы