通过反射往mysql中插入数据

2022-01-22  本文已影响0人  彳亍口巴

通过反射插入数据

平常往数据库中插入数据的时候,我们总是先拿到需要的column和value,然后拼接SQL语句,有了反射后,我们只要通过结构体就可以拿到其所有的column和value,然后拼接就好了,一个函数适用于所有的场景

package main

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
    "reflect"
    "strings"
)

type Data struct {
    ID   string `json:"id"`
    Name string `json:"name"`
    Addr string `json:"addr"`
}

type Location struct {
    X        int `json:"x"`
    Y        int `json:"y"`
    ZIndex   int `json:"zIndex"`
    Status   int `json:"status"`
    ParentID int `json:"parentId"`
}

var db *sqlx.DB
var err error

func main() {
    dsn := "root:123456@tcp(127.0.0.1:3306)/music_world?charset=utf8&parseTime=True"
    //dsn := "root:123456@tcp(127.0.0.1:3306)/music_world?charset=utf8&parseTime=True"
    db, err = sqlx.Connect("mysql", dsn)
    if err != nil {
        fmt.Printf("打开数据库错误:%v\n", err)
        return
    }

    data := Data{
        ID:   "id1",
        Name: "small",
        Addr: "kexing1",
    }
    fmt.Println(data.BuildSql())

    loc := Location{
        X:        11,
        Y:        22,
        ZIndex:   33,
        Status:   44,
        ParentID: 55,
    }
    sql:=loc.BuildSql()
    fmt.Println(sql)
    insert(sql)
}

func insert(sql string) {
    res, err := db.Exec(sql)
    if err != nil {
        panic(err)
    }
    fmt.Println(res.RowsAffected())
}

// BuildSqlINSERT INTO `music_world`.`t_mworld_defaultprops` (`id`, `x`, `y`, `zIndex`, `status`, `parentId`) VALUES ('2', '2', '2', '2', '2', '2');
func (obj *Location) BuildSql() string {
    columns := strings.Builder{}
    values := strings.Builder{}
    typ := reflect.TypeOf(obj).Elem()
    value := reflect.ValueOf(obj).Elem()
    for i := 0; i < typ.NumField(); i++ {
        k := typ.Field(i).Tag.Get("json")
        v := value.Field(i)

        if columns.Len() != 0 {
            columns.WriteString(",")
            values.WriteString(",")
        }
        columns.WriteString(fmt.Sprintf("`%v`", k))
        values.WriteString(fmt.Sprintf("'%v'", v))
        //columns.WriteString("=")
        //columns.WriteString(fmt.Sprintf("%v", v))
    }
    sql := fmt.Sprintf("insert into t_mworld_defaultprops(%s) values(%s)", columns.String(), values.String())
    return sql
}

// BuildSql  INSERT INTO `music_world`.`t_mworld_defaultprops` (`id`, `x`, `y`, `zIndex`, `status`, `parentId`) VALUES ('2', '2', '2', '2', '2', '2');
func (obj *Data) BuildSql() string {
    columns := strings.Builder{}
    values := strings.Builder{}
    typ := reflect.TypeOf(obj).Elem()
    value := reflect.ValueOf(obj).Elem()
    for i := 0; i < typ.NumField(); i++ {
        k := typ.Field(i).Tag.Get("json")
        v := value.Field(i)

        if columns.Len() != 0 {
            columns.WriteString(",")
            values.WriteString(",")
        }
        columns.WriteString(fmt.Sprintf("`%s`", k))
        values.WriteString(fmt.Sprintf("'%s'", v))
        //columns.WriteString("=")
        //columns.WriteString(fmt.Sprintf("%v", v))
    }
    sql := fmt.Sprintf("insert into t_crud(%s) values(%s)", columns.String(), values.String())
    return sql
}

上一篇下一篇

猜你喜欢

热点阅读