猿问

如何告诉Gorm以节省错过的时间。时间字段为 NULL 而不是 '0000-00-00'?

我为用户提供了以下自定义类型:


type User struct {

    UserID    uint64 `gorm:"primaryKey"`

    CreatedAt time.Time

    UpdatedAt time.Time

    LastLogin time.Time

}

当传递给 gorm 的方法时,用户初始化如下:db.Create()


return User{

    UserID:    userID,

    AccountID: accountID,

    UserType:  userType,

    Status:    status,

    UserInfo:  &userInfo,

    CreatedAt: now,

    UpdatedAt: now,

}

因为是MySQL中的可空列,所以我没有在这里初始化它的值。LastLogintimestamp


现在 gorm 将在 SQL 语句中解析未设置的值,并导致以下错误。'0000-00-00 00:00:00.000000'


Error 2021-01-29 15:36:13,388 v1(7) error_logger.go:14 192.168.10.100 - - default - 0 Error 1292: Incorrect datetime value: '0000-00-00' for column 'last_login' at row 1

虽然我理解MySQL如何在不更改某些模式的情况下不允许零时间戳值,但我可以轻松初始化时间。时间字段是一些遥远的日期,例如 2038-ish。我如何告诉 gorm 在 SQML 中将零时间字段作为 NULL 传递?


神不在的星期二
浏览 306回答 2
2回答

蝴蝶刀刀

所以你在这里有几个选择。你可以做一个指针,这意味着它可以是一个值:LastLoginniltype User struct {    ID        uint64 `gorm:"primaryKey"`    CreatedAt time.Time    LastLogin *time.Time}或者像@aureliar提到的那样,你可以使用sql。空时间类型type User struct {    ID        uint64 `gorm:"primaryKey"`    CreatedAt time.Time    LastLogin sql.NullTime}现在,当您在数据库中创建该对象并且未设置 LastLogin 时,它将在数据库中另存为 NULL。https://gorm.io/docs/models.html值得注意的是,如果你使用sql。NullTime,在结构中,您将看到默认时间戳而不是 nil 值

哆啦的时光机

像这样使用type Test struct {    ID uint64 `gorm:"primary_key" json:"id"`    CompletedAt sql.NullTime `gorm:"type:TIMESTAMP NULL"`}它有助于使“完成时间”字段的时间戳类型为空
随时随地看视频慕课网APP

相关分类

Go
我要回答