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) }