web-dev-qa-db-fra.com

Nullable time.Time in golang

J'ai une structure que j'ai l'intention de remplir avec un enregistrement de base de données, l'une des colonnes datetime est nullable:

type Reminder struct {
    Id         int
    CreatedAt  time.Time
    RemindedAt *time.Time
    SenderId   int
    ReceiverId int
}

Comme les pointeurs peuvent être nil, j'ai fait de RemindedAt un pointeur, mais cela nécessitera que le code connaisse la différence entre les variables At. Existe-t-il une manière plus élégante de gérer cela?

32
tlehman

Vous pouvez utiliser pq.NullTime.

De lib/pq sur github:

type NullTime struct {
    Time  time.Time
    Valid bool // Valid is true if Time is not NULL
}

// Scan implements the Scanner interface.
func (nt *NullTime) Scan(value interface{}) error {
    nt.Time, nt.Valid = value.(time.Time)
    return nil
}

// Value implements the driver Valuer interface.
func (nt NullTime) Value() (driver.Value, error) {
    if !nt.Valid {
        return nil, nil
    }
    return nt.Time, nil
}
60
Dmitri Goldring

J'aime l'exemple NullTime de lib/pq. Je l'ai modifié de cette façon pour que le NullTime puisse être traité comme un Time...

type NullTime struct {
    time.Time
    Valid bool
}
6
FogleBird

Pourrait également vouloir vérifier l'implémentation du pilote go-sql, qui est fondamentalement la même chose que celle recommandée ci-dessus. https://godoc.org/github.com/go-sql-driver/mysql#NullTime

3
Steven Soroka

mysql.NullTime est déprécié https://github.com/go-sql-driver/mysql/issues/96 database/sql aura un type NullTime à partir de Go1.13, qui devrait être utilisé à la place https://github.com/golang/go/issues/30305

0
Andrey K.