redis, updatediff
This commit is contained in:
109
dao/dao.go
109
dao/dao.go
@@ -1,6 +1,7 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
putils "git.rosy.net.cn/jx-print/utils"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"reflect"
|
||||
@@ -13,16 +14,17 @@ func Insert(db *sqlx.DB, obj interface{}) (err error) {
|
||||
var (
|
||||
value = reflect.ValueOf(obj)
|
||||
stype = reflect.TypeOf(obj)
|
||||
sname = stype.Name()
|
||||
sql, values = strings.Builder{}, strings.Builder{}
|
||||
sqlParams = []interface{}{}
|
||||
direct reflect.Value
|
||||
)
|
||||
if stype.Kind() != reflect.Struct {
|
||||
direct = reflect.Indirect(value)
|
||||
stype = stype.Elem()
|
||||
} else {
|
||||
direct = value
|
||||
}
|
||||
sname := stype.Name()
|
||||
sql.WriteString("INSERT INTO ")
|
||||
for i := 0; i < stype.NumField()-1; i++ {
|
||||
if stype.Field(i).Type.String() == "*time.Time" {
|
||||
@@ -50,3 +52,108 @@ func Insert(db *sqlx.DB, obj interface{}) (err error) {
|
||||
_, err = db.DB.Exec(sql.String(), sqlParams...)
|
||||
return err
|
||||
}
|
||||
|
||||
func Update(db *sqlx.DB, obj interface{}, fields ...string) (err error) {
|
||||
var (
|
||||
value = reflect.ValueOf(obj)
|
||||
stype = reflect.TypeOf(obj)
|
||||
sql = strings.Builder{}
|
||||
sqlParams = []interface{}{}
|
||||
direct reflect.Value
|
||||
fieldsMap = make(map[string]string)
|
||||
)
|
||||
if stype.Kind() != reflect.Struct {
|
||||
direct = reflect.Indirect(value)
|
||||
stype = stype.Elem()
|
||||
} else {
|
||||
direct = value
|
||||
}
|
||||
sname := stype.Name()
|
||||
sql.WriteString("UPDATE ")
|
||||
sql.WriteString(putils.UnMarshalHr(sname) + " SET ")
|
||||
fieldsStr := []string{}
|
||||
for _, v := range fields {
|
||||
fieldsStr = append(fieldsStr, v+"=?")
|
||||
fieldsMap[v] = v
|
||||
}
|
||||
sql.WriteString(strings.Join(fieldsStr, ","))
|
||||
sql.WriteString(" WHERE id = ?")
|
||||
for i := 0; i < stype.NumField()-1; i++ {
|
||||
if fieldsMap[stype.Field(i).Tag.Get("json")] != "" {
|
||||
if stype.Field(i).Type.String() == "*time.Time" {
|
||||
if direct.Field(i).Interface().(*time.Time) != nil {
|
||||
sqlParams = append(sqlParams, direct.Field(i).Interface())
|
||||
}
|
||||
} else {
|
||||
if !direct.Field(i).IsZero() {
|
||||
sqlParams = append(sqlParams, direct.Field(i).Interface())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if direct.Field(0).Int() == 0 {
|
||||
return err
|
||||
} else {
|
||||
sqlParams = append(sqlParams, direct.Field(0).Int())
|
||||
}
|
||||
_, err = db.DB.Exec(sql.String(), sqlParams...)
|
||||
return err
|
||||
}
|
||||
|
||||
//更新两个结构体中不同的字段
|
||||
//obj是作为参数,obj2是原本的要更新的
|
||||
func UpdateDiff(db *sqlx.DB, obj interface{}, obj2 interface{}) (err error) {
|
||||
var (
|
||||
value = reflect.ValueOf(obj)
|
||||
stype = reflect.TypeOf(obj)
|
||||
value2 = reflect.ValueOf(obj2)
|
||||
stype2 = reflect.TypeOf(obj2)
|
||||
sql = strings.Builder{}
|
||||
sqlParams = []interface{}{}
|
||||
fieldMap1 = make(map[string]interface{})
|
||||
fieldMap2 = make(map[string]interface{})
|
||||
fields = make(map[string]interface{})
|
||||
)
|
||||
if stype.Kind() != reflect.Struct {
|
||||
stype = stype.Elem()
|
||||
value = reflect.Indirect(value)
|
||||
}
|
||||
if stype2.Kind() != reflect.Struct {
|
||||
stype2 = stype2.Elem()
|
||||
value2 = reflect.Indirect(value2)
|
||||
}
|
||||
sname := stype.Name()
|
||||
sname2 := stype2.Name()
|
||||
if sname != sname2 {
|
||||
return fmt.Errorf("请传入两个类型相同的结构体!")
|
||||
}
|
||||
for i := 1; i < stype.NumField()-1; i++ {
|
||||
fieldMap1[stype.Field(i).Tag.Get("json")] = value.Field(i).Interface()
|
||||
}
|
||||
for i := 1; i < stype2.NumField()-1; i++ {
|
||||
fieldMap2[stype2.Field(i).Tag.Get("json")] = value2.Field(i).Interface()
|
||||
}
|
||||
for k, v := range fieldMap1 {
|
||||
if fieldMap2[k] != nil {
|
||||
if fieldMap2[k] != v {
|
||||
fields[k] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
sql.WriteString("UPDATE ")
|
||||
sql.WriteString(putils.UnMarshalHr(sname) + " SET ")
|
||||
fieldsStr := []string{}
|
||||
for k, v := range fields {
|
||||
fieldsStr = append(fieldsStr, k+"=?")
|
||||
sqlParams = append(sqlParams, v)
|
||||
}
|
||||
sql.WriteString(strings.Join(fieldsStr, ","))
|
||||
sql.WriteString(" WHERE id = ?")
|
||||
if value2.Field(0).Int() == 0 {
|
||||
return err
|
||||
} else {
|
||||
sqlParams = append(sqlParams, value2.Field(0).Int())
|
||||
}
|
||||
_, err = db.DB.Exec(sql.String(), sqlParams...)
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user