GORM BeforeSave
时间: 2024-02-13 16:57:38 浏览: 193
GORM是一个Go语言的ORM库,它允许在创建或更新记录之前或之后执行一些操作。其中,BeforeSave是一个钩子函数,它会在创建或更新记录之前被调用。在BeforeSave中,你可以对记录进行修改或者添加一些其他的操作。下面是一个BeforeSave的例子:
```go
func (user *User) BeforeSave(tx *gorm.DB) (err error) {
if user.Password != "" {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
if err != nil {
return err
}
user.Password = string(hashedPassword)
}
return nil
}
```
在这个例子中,我们定义了一个BeforeSave函数,它接收一个*gorm.DB类型的参数tx和一个error类型的返回值。在BeforeSave中,我们对用户的密码进行了加密,并将加密后的密码存储到了数据库中。如果加密过程中出现了错误,我们会返回一个错误。
相关问题
gorm gen自定义方法
在GORM (Go语言 ORM) 中,`gen` 命令用于自动化生成数据库模型相关的代码,包括结构体、映射文件等。如果你想要自定义GORM的行为并添加一些特定于业务逻辑的操作,可以使用`gorm.Model`结构之外创建额外的方法。这种方式被称为"扩展Model"。
例如,你可以创建一个自定义方法,比如 `BeforeCreate`, `AfterSave` 或者 `BeforeDelete`,在数据操作前或后执行特定操作。这些方法会自动被GORM关联到对应的模型上,只要你遵守GORM的函数命名规则(通常以`BeforeXXX`或`AfterXXX`开头)。
下面是一个简单的例子:
```go
type User struct {
gorm.Model
Name string `gorm:"unique"`
// 自定义方法
BeforeSave() error {
// 检查用户名是否为空
if user.Name == "" {
return errors.New("username cannot be empty")
}
return nil
}
}
// 使用自定义方法
db.Create(&user)
```
在这个例子中,`BeforeSave`方法会在用户保存之前被调用。
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`。
阅读全文