84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
|
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)
|
||
|
}
|