在使用gorm进行数据操作时,如果想要避免推送空结构,可以使用gorm提供的Hooks钩子函数来实现。下面是一个示例代码:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
)
type User struct {
ID uint
Name string
Age int
}
func (u *User) BeforeSave(tx *gorm.DB) (err error) {
if u.Name == "" && u.Age == 0 {
return gorm.ErrEmptySlice
}
return nil
}
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
log.Fatal(err)
}
err = db.AutoMigrate(&User{})
if err != nil {
log.Fatal(err)
}
user1 := User{Name: "", Age: 0}
user2 := User{Name: "Alice", Age: 20}
err = db.Save(&user1).Error
if err != nil {
fmt.Println("Save user1 error:", err)
}
err = db.Save(&user2).Error
if err != nil {
fmt.Println("Save user2 error:", err)
}
}
在上面的示例中,定义了一个User
结构体,并在结构体上定义了一个BeforeSave
钩子函数。在该钩子函数中,判断了Name
和Age
字段是否为空,如果为空,则返回gorm.ErrEmptySlice
错误。
在main
函数中,通过db.Save
方法保存了两个用户,一个是空结构体user1
,另一个是有数据的结构体user2
。当保存user1
时,因为Name
和Age
都为空,会触发BeforeSave
钩子函数,抛出gorm.ErrEmptySlice
错误。而保存user2
时,不会触发钩子函数。
通过使用钩子函数,可以实现在保存数据前进行数据校验,避免推送空结构。
上一篇:不要使用格子和宽高比来溢出容器
下一篇:不要使用构造函数