本人在网上寻找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
}