首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何告诉gorm将缺少的time.Time字段保存为NULL,而不是'0000-00-00'?

gorm 是一个流行的 Go 语言 ORM 库,用于操作数据库。在使用 gorm 时,如果一个 time.Time 字段缺少值,gorm 默认会将其保存为 '0000-00-00'。

要告诉 gorm 将缺少的 time.Time 字段保存为 NULL,而不是 '0000-00-00',可以使用 null.Time 类型来替代 time.Time 类型。null.Time 是 gorm 提供的一个可空的时间类型,它可以存储 NULL 值。

以下是具体的步骤:

  1. 首先,确保你已经导入了 github.com/guregu/null/v4 包。这是 gorm 使用的可空类型包。
  2. 在定义结构体时,将 time.Time 字段替换为 null.Time 字段。例如:
代码语言:txt
复制
import (
    "github.com/guregu/null/v4"
    "gorm.io/gorm"
    "time"
)

type User struct {
    ID        uint
    Name      string
    CreatedAt null.Time
    UpdatedAt null.Time
}
  1. 在使用 gorm 进行数据库操作之前,你需要指定对应数据库字段的类型为 datetime,并将其设置为可空。这可以通过在 gorm 的模型定义中添加 tag 来实现。例如:
代码语言:txt
复制
func (User) TableName() string {
    return "users"
}

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
    if u.CreatedAt.IsZero() {
        u.CreatedAt.Time = time.Now()
    }
    return
}

func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
    if u.UpdatedAt.IsZero() {
        u.UpdatedAt.Time = time.Now()
    }
    return
}

func main() {
    db, err := gorm.Open(mysql.Open("dsn"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // 自动迁移模式
    db.AutoMigrate(&User{})
}

以上示例中,CreatedAtUpdatedAt 字段使用了 null.Time 类型,并在 BeforeCreateBeforeUpdate 方法中处理了默认时间的设置。BeforeCreateBeforeUpdate 方法是 gorm 提供的回调函数,用于在创建和更新之前自动执行相关操作。

通过上述步骤,当你使用 gorm 创建或更新模型时,如果 CreatedAtUpdatedAt 字段缺少值,gorm 将会将其保存为 NULL,而不是 '0000-00-00'。

在腾讯云相关产品中,可以使用云数据库 MySQL、云数据库 MariaDB 等产品来存储和操作这样的数据。这些产品提供了稳定可靠的数据库服务,可以满足不同规模和需求的业务场景。

参考链接:腾讯云数据库 MySQL腾讯云数据库 MariaDB

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

golang中使用gorm写入time.Time类型时间问题

在对数据库操作中,通常需要对时间进行处理。gorm在model层结构体定义中,也提供了time.Time类型。但是在实际使用中,如果我们不注意的话,可能会遇到一些奇怪问题。遇到问题1....or rolled back从错误信息中可以看出,online_at由于没有设置具体值,被零值'0000-00-00 00:00:00'占位了。...解决办法方法一:定义model时候,添加字段标签default:null在定义Tag model时候,由于没有定义default:null,因此gorm在处理SQL时候,就会自动使用零值来代替。...`}方法二:使用*time.Time来代替在定义Tag model时候,如果类型定义为 *time.Time, 在gorm处理SQL时候,零值就会使用null来拼接。...个人更推荐使用gorm标签来制定default值。这样在真正需要指定时间时候,只需要time.Now()即可,不是t := time.Now() 然后 &t 赋值。

2.2K20

Go gorm

撰写原生 SQL 缺点为:不可维护性:代码难阅读且不易维护。不可重用性:通常不容易被重用,每个 SQL 语句都需要独立编写并维护。容易犯错:容易犯错,容易缺少引号、忘记加条件等。...*time.Time // A pointer to time.Time, can be null MemberNumber sql.NullString // Uses sql.NullString...// 创建时间(由GORM自动管理) UpdatedAt time.Time // 最后一次更新时间(由GORM自动管理) }约定主键:GORM 使用一个名为ID 字段作为每个模型默认主键...列名:GORM 自动结构体字段名称转换为 snake_case 作为数据库中列名。时间戳字段GORM使用字段 CreatedAt 和 UpdatedAt 来自动跟踪记录创建和更新时间。...此外,如果相关 model 没有定义主键,那么按 model 第一个字段进行排序。

9210

Gorm 数据库表迁移与表模型定义

UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } 您可以将它嵌入到您结构体中,以包含这几个字段,详情请参考 嵌入结构体...`gorm:"column:beast_id"` // 列名设为 `beast_id` Birthday time.Time `gorm:"column:day_of_the_beast...` } 4.4 时间戳跟踪 4.4.1 CreatedAt 对于有 CreatedAt 字段模型,创建记录时,如果该字段值为零值,则将该字段值设为当前时间 db.Create(&user) // ...秒时间戳,不是 time,您只需简单地 time.Time 修改为 int 即可 type User struct { CreatedAt time.Time // 在创建时,如果该字段值为零值...在使用指定数据库数据类型时,它需要是完整数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT serializer 指定如何数据序列化和反序列化到数据库中序列化程序

29610

Gorm-定义模型字段和标签(一)

Gorm是一个基于Golang语言ORM库,它提供了一种简单易用方式,帮助开发人员更轻松地管理数据库。定义模型字段Gorm使用结构体来定义数据库模型,每个字段都对应着数据库表中一个列。...在Gorm中,开发人员可以为每个字段指定类型和标签。字段类型字段类型是指数据库表中每个列数据类型。在Gorm中,开发人员可以使用常见数据类型,例如字符串、整数、浮点数、时间、二进制等。...:username;size:100;not null"` Age int `gorm:"not null"` Email string `gorm:"unique...;not null"` Avatar []byte CreatedAt time.Time `gorm:"autoCreateTime"` UpdatedAt time.Time...例如,我们使用primaryKey标签ID字段指定为主键,使用column标签Name字段指定为数据库中列名,使用unique标签Email字段指定为唯一约束。

1.3K20

gorm查询嵌套结构体,嵌套预加载preload,关联,外键foreignkey,引用references

用join查询虽然强大,但是无法查询结构映射到嵌套结构体。..."` CreatedAt time.Time `gorm:"autoCreateTime"` UpdatedAt time.Time DeletedAt *time.Time...GetAllBusiness(projectid int64) (business []Business, err error) { // 坑:preload里不是对应名字,而是主表中字段名字...Find(&business).Error return business, err } 注意: // 注释:Has Many一对多外键、引用 // 1.默认外键是 从表中字段为 主表模型类型(...// 4.用preload来查询关联,preload中名字必须是主表中字段名,不是从表名 // 5.不必是gorm建立表才能这样用,beego orm建立表也可以用 // 6.嵌套预加载中foreignkey

5.7K30

GORM V2 模型定义、约定、标签

01 概念 使用 GORM 操作数据库,需要了解 GORM 约定和字段标签提供约束。...time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } 04 嵌入结构体 对于匿名字段GORM 会将其字段包含在父结构体中...在 GO 语言中,根据名称首字母大小写来定义是否可被导出,GORM 使用可导出字段进行 CRUD 时拥有全部权限,另外,GORM 可以使用标签控制字段级别的权限,可以让一个字段权限是只读、只写...比如时间追踪默认是将为零值创建时间CreatedAt 字段以当前时间填充,以当前时间戳秒数填充 UpdatedAt 字段,如果您想要保存 UNIX(毫/纳)秒时间戳,不是 time,您只需简单地...time.Time 修改为 int 即可,默认时间戳是 Unix 秒,你还可以使用标签时间戳单位改为纳秒或毫秒。

3.7K20

RTMP协议视频平台EasyDSS如何通过Go语言gorm框架钩子函数精简代码?

在EasyDSS开发过程中,数据写入到数据库时,有大量相同操作。如以下两个步骤设置更新时间和创建时间。...进行设置,为了后期做分布式可能做此处理,因此不使用 int 类型 ID string `json:"id" gorm:"PRIMARY_KEY;Size:32;NOT NULL...;"` CreateAt time.Time `json:"createAt" gorm:"type:datetime"` UpdateAt time.Time `json:"updateAt..." gorm:"type:datetime"` } 现在需求是希望在创建和更新数据时候自动更新 CreateAt 和 UpdateAt 字段不用每次都显示调用赋值语句。...(tx *gorm.DB) (err error) { u.UpdateAt = time.Now() return } 以上代码就实现了对应功能,在创建数据和更新数据之前,均会更新已经设置好字段

40330

Prometheus-Operator:告警认领功能实现

上篇回顾 上篇文章我们主要是针对告警路由进行了讲解,告警路由使用无疑是非常方便,但是缺少一些告警处理人相关提醒,所以我们本篇文章讲解一下告警认领功能实现 prometheus架构图 通过上图我们可以发现...`gorm:"column:creation_time" json:"created_at" form:"created_at"` UpdatedAt time.Time `gorm...: '告警名称';size:500;not null" json:"alert_name" form:"alert_name"` Instance string `gorm..." form:"claim_users"` UID string `gorm:"comment: '告警UID';size:500;not null;unique..." json:"uid" form:"uid"` } 主要说一下UID字段含义,主要功能是对每一条告警增加一个UID,用于区分是否为同一条告警记录,进而绑定认领人,这里UID使用md5方式加密告警字段

47510

Gorm实战,轻松掌握数据库增删改查技巧!

Gorm实战,轻松掌握数据库增删改查技巧! CRUD通常指数据库增删改查操作,本文详细介绍了如何使用GORM实现创建、查询、更新和删除操作。...GORM 生成单独一条SQL语句来插入所有数据,并回填主键值,钩子方法也会被调用。...此外,如果相关 model 没有定义主键,那么按 model 第一个字段进行排序。...`deleted_at` IS NULL 若要在查询条件中包含零值,可以使用map,该映射包含所有键值作为查询条件,例如: // 如果想要在查询中包含0字段,可以使用map来做 db.Where..., 转到 Group 条件 获取如何构建复杂 SQL 查询信息 8.6 sql.Rows 扫描至 model 使用 ScanRows 一行记录扫描至 struct,例如: rows, err :

2.7K20

Go语言ORM-gorm学习笔记(一)

tag标记 column 定义字段名称 使用tag标记 comment 定义字段注释 Age sql.NullInt64 `gorm:"comment:'年龄'"` Birthday *time.Time...设置字段大小为255 MemberNumber *string `gorm:"unique;not null;comment:'会员卡号'"` // 使用tag标记 unique 设置唯一 使用tag...标记 not null 设置字段属性不为空 Num int `gorm:"AUTO_INCREMENT;comment:'数量'"` // 使用tag标记 AUTO_INCREMENT 设置字段自增...列指定为唯一 DEFAULT 指定列默认值 PRECISION 指定列精度 NOT NULL 列指定为非NULL AUTO_INCREMENT 指定列是否为自增类型 INDEX 创建具有或不带名称索引...,如果多个索引同名则创建复合索引 UNIQUE_INDEX 和INDEX类似,只不过创建是唯一索引 EMBEDDED 结构设置为嵌入 EMBEDDED_PREFIX 设置嵌入结构前缀 - 忽略此字段

1.6K40
领券