diff

package module
v1.0.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 1, 2025 License: MIT Imports: 6 Imported by: 0

README

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

Documentation

Index

Constants

This section is empty.

Variables

View Source
var IgnoreName = []string{
	"updated_at",
	"updated_by",
	"created_at",
	"created_by",
}

Functions

func BuildUpdateSql added in v1.0.1

func BuildUpdateSql[T any](t Traceable[T]) (sql string)

func CopyValues added in v1.0.3

func CopyValues[T any](fromEntity T, toEntity *T)

func IsChanged added in v1.0.4

func IsChanged(props map[string]PropValue) (isChanged bool)

结构体中是否有字段被修改。这里会排除 IgnoreName 中的字段

func Trace

func Trace[T any](entity T, fn func(entity *T)) (e T, props map[string]PropValue)

func UTC added in v1.0.3

func UTC() *time.Time

func UpdateMap added in v1.0.3

func UpdateMap(dest interface{}, updates interface{}) error

为目标结构体批量更新字段值。 注意:推荐传入的字段都是指针类型,空指针会被忽略更新。 例如:

type UpdateUser struct {
	UserName   *string
	UserStatus *int
}

Types

type PropValue

type PropValue struct {
	Type       reflect.Type
	ColumnName string
	Value      reflect.Value
}

type Traceable

type Traceable[T any] struct {
	Entity    T                    // Entity.
	Props     map[string]PropValue // Changed fields.
	Columns   map[string]interface{}
	IsChanged bool   // Whether the field is changed.
	UpdateSql string // Update sql statement.
}

func TraceProps added in v1.0.1

func TraceProps[T any](entity T, fn func(entity *T)) (t Traceable[T])

func TraceUpdate added in v1.0.1

func TraceUpdate[T any](entity T, fn func(entity *T)) (t Traceable[T])

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL