Go语言通过map的key/value对mysql数据表进行插入和更新

807 阅读2分钟

本人在网上寻找go语言对应mysql的ORM组件,确实有一些,但用起来感觉都不是那么回事。所以一气之下,就写了两个通过map来插入和更新mysql的实用小函数,这两个小函数可以应付大多数的mysql单条更新和插入操作。代码如下:

使用这两个函数前,需要首先保证sql的DB已经打开,并myDb指针有效。

func init() {
   dburl_con := fmt.Sprintf("%s:%s@%s", user, pwd, dburl)
   db, err := sql.Open("mysql", dburl_con)
   if err != nil {
      panic(err)
   }
   myDb = db
}

InsertMysql() 根据map内容插入数据到table中

  • 调用方式,其中第一个返回值是插入到数据表中的id
/*
* 插入一条数据,并返回新建id,key必须和表中的字段名称一致
* 执行的sql是: INSERT INTO table1(name,age,gender) values("zhangsan",22,0);
*/
   m = map[string]interface{}{
       "name": "zhangsan",
       "age": 20,
       "gender": 0 }
       
   id, err := xxx.InsertMysql("table1", m)
  • 函数实现如下
func InsertMysql(tableName string, m map[string]interface{}) (int64, error) {
	var insertSql = "INSERT INTO " + tableName + " "
	var keyStr []string
	var valStr []string
	var values []interface{}
	for k, v := range m {
		keyStr = append(keyStr, k)
		valStr = append(valStr, "?")
		values = append(values, v)
	}
	insertSql += "(" + strings.Join(keyStr, ",") + ")"
	insertSql += " VALUES (" + strings.Join(valStr, ",") + ")"
	stm, e := myDb.Prepare(insertSql)
	if e != nil {
		log.Error(e)
		return -1, e
	}
	defer stm.Close()
	result, err := stm.Exec(values...)
	if err != nil {
		log.Error(err)
		return -1, e
	}
	return result.LastInsertId()
}

UpdateMysql() 根据map内容插入数据到table中

  • 调用方式
/*
* 把id和name作为where的条件,更新gender和age字段
* 执行对应的sql是:update table1 set age=22, gender=1 where id = 10 and name = "zhangsan";
*/
   m = map[string]interface{}{
       "id": 10,
       "name": "zhangsan",
       "age": 22,
       "gender": 1 }
   mysql.UpdateMySql("table1", []string{"id", "name"}, m)
  • 函数实现如下
func UpdateMySql(tableName string, whereKey []string, m map[string]interface{}) error {
	var updateSql = "UPDATE " + tableName + " t SET "
	var keyStr []string
	var values []interface{}
	var whereMap = map[string]interface{}{}
	for k, v := range m {
		if isInArray(whereKey, k) { // where条件不放进update的值里面
			whereMap[k] = v
		} else {
			keyStr = append(keyStr, " t."+k+"=?")
			values = append(values, v)
		}
	}
	updateSql += strings.Join(keyStr, ",")

	// 构造where子句
	var whereStr []string
	for k, v := range whereMap {
		whereStr = append(whereStr, " t."+k+"=?")
		values = append(values, v)
	}
	updateSql += " where" + strings.Join(whereStr, " and ")

	stm, e := myDb.Prepare(updateSql)
	if e != nil {
		log.Error(e)
		return e
	}
	defer stm.Close()
	_, err := stm.Exec(values...)
	if err != nil {
		log.Error(err)
		return err
	}
	return nil
}

func isInArray(array []string, v string) bool {
	for _, s := range array {
		if s == v {
			return true
		}
	}
	return false
}