sql: ошибка сканирования для индекса столбца 6, имя "schedule_date": null: невозможно сканировать тип []uint8 в null.Time
Я получаю эту ошибку и пробую все доступное в интернете и stackoverlow, чтобы решить эту проблему. Я пытаюсь выполнить запрос после подключения базы данных MySQL с помощью пакета sqlx и просмотреть результаты. Я попробовал решения, которыми поделились для похожих вопросов, но у меня ничего не получалось.
type Trip struct {
ID int `db:"id"`
Type int `db:"type"`
DID int `db:"did"`
DUID int `db:"duid"`
VID int `db:"vid"`
Sts string `db:"sts"`
AM int `db:"am"`
Sdate null.Time `db:"sdate"`
}
func GetTripByID(db sqlx.Queryer, id int) (*Trip, error) {
row := db.QueryRowx("select ID,Type,DID,DUID,VID,Sts,AM,Sdate from mytbl where ID=123", id)
var t Trip
err := row.StructScan(&t)
if err != nil {
fmt.Println("Error during struct scan")
return nil, err
}
return &t, nil
}
Точная ошибка, которую я получаю,
паника: sql: ошибка сканирования по индексу столбца 6, имя "sdate": null: нельзя сканировать тип []uint8 в null. Время: [50 48 49 56 45 49 50 45 48 55 32 48 50 58 48 56 58 53 49]
с точки зрения синтаксиса, запрос работает отлично, и я получаю результаты, когда я запускаю его в SQL Workbench. Я также попробовал ParseTime=true, как предлагается по одной из ссылок.
2 ответа
Попробуйте использовать специальные типы для нулевых значений в пакете "database/sql"
Например, когда text или varchar могут иметь значение null в db, используйте sql.NullString для типа var.
Как предложено выше, я сделал нулевую обработку для столбца "Sdate"
// NullTime defining nullTime
type NullTime mysql.NullTime
// Scan implements the Scanner interface for NullTime
func (nt *NullTime) Scan(value interface{}) error {
var t mysql.NullTime
if err := t.Scan(value); err != nil {
return err
}
// if nil then make Valid false
if reflect.TypeOf(value) == nil {
*nt = NullTime{t.Time, false}
} else {
*nt = NullTime{t.Time, true}
}
и изменения в структуре
type Trip struct {
ID int `db:"id"`
Type int `db:"type"`
DID int `db:"did"`
DUID int `db:"duid"`
VID int `db:"vid"`
Sts string `db:"sts"`
AM int `db:"am"`
Sdate NullTime `db:"sdate"`
}
поэтому решение заключается не только в определении структуры для обработки пустых значений, но и в реализации интерфейса сканера.