为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
神不在的星期二 2022-08-01 19:00:34
我为用户提供了以下自定义类型: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 传递?
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

所以你在这里有几个选择。你可以做一个指针,这意味着它可以是一个值:LastLoginnil


type 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 值


查看完整回答
反对 回复 2022-08-01
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

像这样使用


type Test struct {

    ID uint64 `gorm:"primary_key" json:"id"`

    CompletedAt sql.NullTime `gorm:"type:TIMESTAMP NULL"`

}

它有助于使“完成时间”字段的时间戳类型为空


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信