将gorm.Model改为自定义Model

我相信有很多人都想把

type Model struct {
   ID        uint `gorm:"primary_key"`
   CreatedAt time.Time
   UpdatedAt time.Time
   DeletedAt *time.Time `sql:"index"`
}

把时间类型改为字符串或者int64来记录时间  弄了几次数据库DeletedAt保存的空串导致失败(原因在于DeletedAt必须定义指针类型,这样创建的时候就不会往数据库插入空串),下面以string写示例

type Model struct {
   ID        uint    `gorm:"primary_key" json:"id"`
   CreatedAt string  `json:"created_at"`
   UpdatedAt string  `json:"updated_at"`
   DeletedAt *string `gorm:"default:null;index:dbc" json:"deleted_at"`
}
根据gorm提供的db.Callback().Create().Replae("gorm:create", newCreateFunction)替换gorm原有的回调方法,我们可以全局搜索DefaultCallback就会找到gorm原有的回调方法,其中create、update、delete与时间相关的都要替换。

下面我们进行方法替换

db.Callback().Create().Replace("gorm:update_time_stamp",updateTimeStampForCreateCallback)
db.Callback().Update().Replace("gorm:update_time_stamp",updateTimeStampForUpdateCallback)
db.Callback().Delete().Replace("gorm:delete", deleteCallback)

//将gorm自带回调方法copy出来进行修改

func updateStampForCreateCallback(scope *gorm.Scope) {

   if !scope.HasError() {
//此处时间如果是int64就修改time.Now().Unix()就行了
      nowTime := time.Now().Format("2006-01-02 15:04:05")
      if createTimeField, ok := scope.FieldByName("CreatedAt"); ok {
         if createTimeField.IsBlank {
            createTimeField.Set(nowTime)
         }
      }

      if modifyTimeField, ok := scope.FieldByName("UpdatedAt"); ok {
         if modifyTimeField.IsBlank {
            modifyTimeField.Set(nowTime)
         }
      }
   }
}

func updateTimeStampForUpdateCallback(scope *gorm.Scope) {
   if _, ok := scope.Get("gorm:update_column"); !ok {
//此处时间如果是int64就修改time.Now().Unix()就行了
      scope.SetColumn("UpdatedAt", time.Now().Format("2006-01-02 15:04:05"))
   }
}

func deleteCallback(scope *gorm.Scope) {
   if !scope.HasError() {
      var extraOption string
      if str, ok := scope.Get("gorm:delete_option"); ok {
         extraOption = fmt.Sprint(str)
      }

      deletedOnField, hasDeletedOnField := scope.FieldByName("DeletedAt")

      if !scope.Search.Unscoped && hasDeletedOnField {
         scope.Raw(fmt.Sprintf(
            "UPDATE %v SET %v=%v%v%v",
            scope.QuotedTableName(),
            scope.Quote(deletedOnField.DBName),
//此处时间如果是int64就修改time.Now().Unix()就行了
            scope.AddToVars(time.Now().Format("2006-01-02 15:04:05")),
            addExtraSpaceIfExist(scope.CombinedConditionSql()),
            addExtraSpaceIfExist(extraOption),
         )).Exec()
      } else {
         scope.Raw(fmt.Sprintf(
            "DELETE FROM %v%v%v",
            scope.QuotedTableName(),
            addExtraSpaceIfExist(scope.CombinedConditionSql()),
            addExtraSpaceIfExist(extraOption),
         )).Exec()
      }
   }
}
func addExtraSpaceIfExist(str string) string {
   if str != "" {
      return " " + str
   }
   return ""
}

到此结束希望对大家有所帮助,我也被这里折磨了好久

引用和提到,gorm.ModelGORM内置的一个结构体,用于定义模型。它包含了ID、CreatedAt、UpdatedAt、DeletedAt这四个字段。具体的定义如下: ```go type Model struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time } ``` 这个结构体可以作为其他模型的嵌入字段,以便在数据库中创建对应的数据表。引用给出了一个示例,展示了如何使用gorm.Model来定义一个用户模型: ```go type User struct { gorm.Model } ``` 通过嵌入gorm.Model,User模型将自动拥有ID、CreatedAt、UpdatedAt、DeletedAt这四个字段。 综上所述,gorm.ModelGORM提供的一个方便的结构体,用于定义模型并自动创建数据库表。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Gormgorm.Model详解](https://blog.csdn.net/weixin_52690231/article/details/124543708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [GORM模型(Model)定义](https://blog.csdn.net/jiangshanghe/article/details/124408109)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值