gorm新增时间字段不填充_Gorm使用心得,那些你可能会踩到的坑。
时间: 2024-01-21 12:16:09 浏览: 29
在使用 Gorm 进行新增操作时,如果你在数据模型中定义了时间字段,但是在新增时没有传入时间值,那么 Gorm 会自动填充当前时间。如果你不想让 Gorm 自动填充时间字段,可以在定义模型时指定时间字段的类型为 `*time.Time`,然后在新增数据时将时间字段的值设置为 `nil`。
示例代码如下:
```go
type User struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"not null"`
CreatedAt *time.Time `gorm:"index"`
}
// 新增用户,不填充 CreatedAt 字段
user := User{Name: "test"}
db.Create(&user)
```
注意,如果你在定义模型时使用了 `time.Time` 类型而不是 `*time.Time` 类型,那么 Gorm 会自动填充时间字段,即使你在新增时没有传入时间值。
相关问题
GORM 字段值不重复
如果你使用 GORM ORM 框架来操作数据库,那么可以通过设置 tag 来实现字段值不重复的约束。
在定义结构体时,可以在字段的 tag 中添加 `unique` 标签,表示该字段的值不重复。例如:
```go
type User struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"unique"`
Email string `gorm:"unique"`
Password string
}
```
在这个例子中,`Name` 和 `Email` 字段都被标记为 `unique`,表示这两个字段的值都不重复。
当使用 `Create` 或 `Save` 等方法向数据库中插入或更新数据时,如果某个字段的值已经存在于数据库中,那么会返回一个错误。你可以根据返回的错误信息来判断具体是哪个字段的值重复了。
除了使用 `unique` 标签外,还可以使用 `index` 标签来给字段创建索引,以提高查询效率。例如:
```go
type User struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"index"`
Email string `gorm:"index"`
Password string
}
```
在这个例子中,`Name` 和 `Email` 字段都被标记为 `index`,表示会为这两个字段创建索引,以提高查询效率。
GORM 字段自动更新时间
在 GORM 中,可以使用 `BeforeSave` 和 `BeforeUpdate` 钩子函数来自动更新字段时间。具体实现如下:
```go
import (
"time"
"gorm.io/gorm"
)
type User struct {
gorm.Model
Name string
CreatedAt time.Time
UpdatedAt time.Time
}
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
if u.ID == 0 {
u.CreatedAt = time.Now()
}
u.UpdatedAt = time.Now()
return nil
}
```
在上面的例子中,定义了一个 `User` 结构体,其中包含了 `CreatedAt` 和 `UpdatedAt` 字段。在 `BeforeSave` 函数中,通过判断 `ID` 是否为 0 来判断是否为新数据,如果是新数据,则更新 `CreatedAt` 字段,否则更新 `UpdatedAt` 字段。
需要注意的是,`BeforeSave` 和 `BeforeUpdate` 钩子函数的返回值类型必须为 `error`,如果没有错误则返回 `nil`。