【问题标题】:How to add default value in gorm from another package如何在另一个包的gorm中添加默认值
【发布时间】:2021-08-31 06:00:50
【问题描述】:

我有一个结构定义为

type User struct {
    Name string `gorm:"type:varchar(100);size:100;not null;default:null;" json:"name"`
    UserTypeId uuid.UUID sql:"type:uuid REFERENCES usertype(id);" gorm:"index;not null;default:null;" json:"user_type_id"`
    Score int gorm:"size:36;index;not null;default:null;" json:"score"`
}

现在我想使用在另一个包中定义的一些常量让我们说 defaultID = '1234' 而不是 null 作为 UserTypeID 中的默认值,我如何在 gorm 默认值中提及这个常量,我也不想这样写

 UserTypeId    sql:"type:uuid REFERENCES usertype(id);" gorm:"index;not null;default:1234;" json:"user_type_id"`

我不想直接提及 id,而是想从定义的常量中获取它。

【问题讨论】:

    标签: sql postgresql go go-gorm


    【解决方案1】:

    您可以使用BeforeSaveBeforeUpdate 挂钩来实现此目的。例如:

    func (u *User) BeforeSave(tx *gorm.DB) error {
      //first, check the UserTypeId value
    
      //second, update the value
      u.UserTypeId = defaultID
    }
    

    【讨论】:

    • 我喜欢这个解决方案,但钩子没有启动,你能指导我如何使用它吗?我想我正面临这个问题link
    • 保存记录时使用什么方法? Save, Create, Update, Updates?
    • 尝试使用 AutoMigrate
    • 我想添加一个 UserTypeID 作为新列,然后想设置默认 id
    • 我认为钩子不会被 AutoMigrate 触发,这个答案不适用于它,抱歉。
    【解决方案2】:

    结构标签不能由字符串常量构建。这是by design

    但是,您可以使用反射包实现此目的,但不推荐。

    【讨论】:

    • 那么在这种情况下,也许我必须将该字段设为空并回填它,因为我真的希望将该字段取自常量以便更好地使用
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多