Gorm BeforeCreate 挂钩无法生成 UUID

Gorm BeforeCreate hook is not working to generate a UUID

我每次创建公司时都试图生成一个 UUID。我想过在钩子函数中做,但它不起作用。我试图在程序执行时恐慌,但钩子没有响应。

我遵循了有关如何实现挂钩的文档,但它对我不起作用。

挂钩文档:https://gorm.io/docs/hooks.html

import (
    "time"

    "github.com/jinzhu/gorm"
    uuid "github.com/satori/go.uuid"
)


type Base struct {
    ID        uuid.UUID  `gorm:"type:UUID;" json:"_id"`
    CreatedAt time.Time  `gorm:"type:Date;" json:"created_at"`
    UpdatedAt time.Time  `gorm:"type:Date;" json:"updated_at"`
    DeletedAt *time.Time `gorm:"type:Date;" json:"deleted_at"`
}

type CompanyModel struct {
    Base
    // Departments []DepartmentModel `gorm:"foreignKey:id" json:"departments"`
    Cvr         int               `gorm:"not null" json:"cvr"`
    Name        string            `gorm:"not null" json:"name"`
}

// BeforeCreate creates
func (u *Base) BeforeCreate(tx *gorm.DB) (err error) {
    u.ID = uuid.NewV4()
    panic(u.ID)
    return
}

// BeforeSave creates
func (u *Base) BeforeSave(tx *gorm.DB) (err error) {
    u.ID = uuid.NewV4()
    panic(u.ID)
    return
}

我正在通过以下方式创建公司

    tx := db.Session(&gorm.Session{SkipHooks: false}).Create(&models.CompanyModel{
        Cvr:  12333,
        Name: "test,
        // Departments: company.Departments,
    },
    )

我执行时保存的值总是:

[1.479ms] [rows:0] INSERT INTO "company_models" ("id","created_at","updated_at","deleted_at","cvr","name") VALUES ('00000000-0000-0000-0000-000000000000','2021-04-21 18:00:51.879','2021-04-21 18:00:51.879',NULL,12333,'test')

看来您使用的是 gorm v1,我认为您需要 gorm v2。导入是 "gorm.io/gorm".

最小工作示例:

package main

import (
    "fmt"
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
)

type User struct {
    Id int
    Name string
}

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
    u.Name = "Steve"
    return
}

func (u *User) BeforeSave(tx *gorm.DB) (err error) {
    u.Name = "Sally"
    return
}

func main() {
    db, err := gorm.Open(sqlite.Open("hooks.db"), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    db.AutoMigrate(&User{})
    user := User{
        Name: "Blake",
    }
    db.Create(&user)
    fmt.Println(user.Name)
    user.Name = "Tyler"
    db.Save(&user)
    fmt.Println(user.Name)
}

打印:

Steve
Sally