Skip to content

cners/diff

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

diff

When modifying a struct, you need to update it to the database. Through the diff package, you can generate SQL on demand, only including the fields that need to be modified.

Install

go get github.com/cners/diff

Example

package main

import (
	"fmt"
	"time"

	"github.com/cners/diff"
)

type User struct {
	UserId     int64      `json:"user_id" gorm:"column:user_id;primaryKey;"`                                               // 用户id
	UserName   string     `json:"user_name" gorm:"column:user_name;type:varchar;not null;default:''"`                      // 用户名
	UserStatus int        `json:"user_status" gorm:"column:user_status;type:int;not null;default:1"`                       // 状态1正常2停用
	UserGender UserGender `json:"user_gender" gorm:"column:user_gender;type:int;not null;default:0"`                       // 性别0未设置1男2女
	UserRemark string     `json:"user_remark" gorm:"column:user_remark;type:varchar;not null;default:''"`                  // 备注
	IsDeleted  bool       `json:"is_deleted" gorm:"column:is_deleted;type:boolean;not null;default:false"`                 // 是否删除
	CreatedBy  int64      `json:"created_by" gorm:"column:created_by;type:bigint;not null;default:0"`                      // 创建人
	CreatedAt  time.Time  `json:"created_at" gorm:"column:created_at;type:timestamptz;not null;default:CURRENT_TIMESTAMP"` // 创建时间
	UpdatedAt  *time.Time `json:"updated_at" gorm:"column:updated_at;type:timestamptz"`                                    // 修改时间
	UpdatedBy  int64      `json:"updated_by" gorm:"column:updated_by;type:bigint;not null;default:0"`                      // 修改人
}

func (*User) TableName() string {
	return "sys_user"
}

// 定义UserGender的枚举 0未知 1男 2女
type UserGender int

const (
	UserGenderUnknown UserGender = iota
	UserGenderMale
	UserGenderFemale
)

func main() {
	now := time.Now().Add(-time.Hour * 10).UTC()
	user := User{
		UserId:     54746881978,
		UserName:   "test",
		UserStatus: 1,
		UpdatedAt:  &now,
	}
	result := diff.TraceUpdate(user, func(user *User) {
		now := time.Now().UTC()
		user.UserName = "test2"
		user.UserStatus = 2
		user.UserGender = UserGenderFemale
		user.UpdatedAt = &now
		user.IsDeleted = true
		// 也可以通过 diff.UpdateMap(user, &params_user) 批量更新字段值,来简化代码。
	})
	fmt.Println(result.UpdateSql)
}

Output:

UPDATE "sys_user" SET "updated_at" = '2025-05-16T08:02:22Z',"user_name" = 'test2',"user_status" = 2,"user_gender" = 2,"is_deleted" = true WHERE "user_id" = 54746881978

About

把改变的属性,提取并生成SQL语句

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages