sql: ошибка сканирования для индекса столбца 6, имя «schedule_date»: null: невозможно сканировать тип [] uint8 в null.Time - PullRequest
0 голосов
/ 10 января 2019

Я получаю эту ошибку и перепробовал все доступное в интернете и 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 в ноль. Время: [50 48 49 56 45 49 50 45 48 55 32 48 50 58 48 56 58 53 49]

Синтаксис

, если запрос работает отлично, и я получаю результаты, когда запускаю его в рабочей среде sql. Я также попробовал ParseTime = true, как предлагается по одной из ссылок.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Как было предложено выше, я сделал нулевую обработку для столбца "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"`
}

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

0 голосов
/ 10 января 2019

Попробуйте использовать специальные типы для нулевых значений в пакете "database / sql"

Например, когда text или varchar могут иметь значение null в db, используйте sql.NullString для типа var.

...