light-core/pkg/mySql/Insert.go

84 lines
1.8 KiB
Go
Raw Normal View History

2024-12-17 22:47:16 +08:00
package mySql
import (
"fmt"
"github.com/Masterminds/squirrel"
"gorm.io/gorm"
"reflect"
"strings"
"time"
)
type Insert struct {
tableName string
columns []*Column
db *gorm.DB
}
func NewInsert(tableName string, db *gorm.DB) *Insert {
return &Insert{tableName: tableName, db: db}
}
func (t *Insert) AddColumn(column string, value interface{}) *Insert {
t.columns = append(t.columns, NewColumn(fmt.Sprintf("`%s`", column), value))
return t
}
func (t *Insert) AddCreatedColumn() *Insert {
return t.AddColumn("created_at", time.Now())
}
func (t *Insert) AddUpdatedColumn() *Insert {
return t.AddColumn("updated_at", time.Now())
}
func (t *Insert) AddCreatedAndUpdatedColumns() *Insert {
return t.AddCreatedColumn().AddUpdatedColumn()
}
func (t *Insert) AddColumns(value map[string]interface{}) *Insert {
for s, i := range value {
t.AddColumn(s, i)
}
return t
}
func (t *Insert) MountColumn(data interface{}) *Insert {
v := reflect.ValueOf(data)
v = v.Elem()
for i := 0; i < v.NumField(); i++ {
column := v.Type().Field(i).Tag.Get("column")
if column != "" {
split := NewStringSplit(strings.ToUpper(column), ":")
split.RunCount1Func(func(str string) {
t.AddColumn(column, v.Field(i).Interface())
})
split.RunCount2Func(func(str1, str2 string) {
if str2 == "KEY" {
t.AddColumn(str1, nil)
} else {
t.AddColumn(str1, v.Field(i).Interface())
}
})
}
}
return t
}
func (t *Insert) Insert() error {
return t.Mapper().Exec().Error
}
func (t *Insert) Mapper() *SqlMapper {
columns := make([]string, 0)
values := make([]interface{}, 0)
for _, v := range t.columns {
columns = append(columns, v.name)
values = append(values, v.value)
}
squ := squirrel.Insert(fmt.Sprintf("`%s`", t.tableName)).Columns(columns...).Values(values...)
return Mapper(squ.ToSql()).setDB(t.db)
}