如何让GORM插入/更新时自动将PhoneNumber的SHA256哈希存入HashID字段
实现方案
GORM 支持生命周期钩子,你可以通过为 Users 模型实现 BeforeCreate 和 BeforeUpdate 方法,在插入、更新操作执行前自动计算手机号的 SHA256 哈希并赋值给 HashID 字段,具体步骤如下:
1. 引入依赖包
首先导入哈希计算需要的包:
import ( "crypto/sha256" "encoding/hex" "gorm.io/gorm" )
2. 实现钩子方法
给 Users 结构体添加两个钩子方法,分别在插入和更新前触发:
// 创建前触发 func (u *Users) BeforeCreate(tx *gorm.DB) (err error) { // 仅当手机号不为空时计算哈希 if u.PhoneNumber != "" { hash := sha256.Sum256([]byte(u.PhoneNumber)) u.HashID = hex.EncodeToString(hash[:]) } return } // 更新前触发 func (u *Users) BeforeUpdate(tx *gorm.DB) (err error) { // 仅当手机号被更新时重新计算哈希 if tx.Statement.Changed("PhoneNumber") { hash := sha256.Sum256([]byte(u.PhoneNumber)) u.HashID = hex.EncodeToString(hash[:]) } return }
注意事项
- 你提供的模型代码中
Biography字段的 Tag 末尾缺少反引号,需要修正避免编译报错 - 你的模型同时嵌入了
gorm.Model并自定义了ID字段,gorm.Model本身已经包含ID字段,二者会冲突,建议要么删除自定义的ID字段,要么去掉gorm.Model嵌入自行定义所需的时间、删除标记字段 - 如果业务场景中允许手机号为空,你可以按需补充空值场景下的 HashID 生成逻辑
内容的提问来源于stack exchange,提问作者Mohammad Derakhshan
相关产品推荐
相关产品推荐

