go - 数据库操作

2018-06-13  本文已影响0人  Ismail丶

在工作之余需要进行api开发,记录下go学习的中的代码

引入 第三方和系统框架

import (
  "database/sql" // 导入sql
  "fmt" _ "github.com/go-sql-driver/mysql" // 引入mysql 驱动
  //"github.com/widuu/gojson"
  "time"
  "crypto/md5"
  "encoding/hex"
  "strconv"
)

定义结钩体,接口用于连接数据库

//定义结钩体,接口
type MysqlDb struct {
  KKDb *sql.DB  //定义结构体
}

打开数据库操作

//打开数据库
func (f *MysqlDb) KKOpenMysql() bool {
  Odb, err := sql.Open("mysql", KKDbUsername+":"+KKDbPassowrd+"@tcp("+KKDbHostsip+")/"+KKDbname+"?charset=utf8")
  //Odb, err := sql.Open("mysql","root:szy920514@tcp(localhost:3306)/NewPro?charset=utf8")

  if err != nil {
      return false
  }else{
      f.KKDb = Odb
      return true
  }

}

关闭数据库操作

// 关闭数据库
func (f *MysqlDb) KKCloseMysql() { //关闭

  defer f.KKDb.Close()
  fmt.Println("链接数据库成功...........已经关闭")
}

插入一条数据:程序默认打开数据库

/*
插入一条数据:程序默认打开数据库
sqlString:sql语句,注意values?占位符
sqlValues:插入的的值
*/

func (f *MysqlDb)KKInsertValues(sqlString string,sqlValues ...interface{} ) bool {
  //err := f.KKDb.Exec(("INSERT INTO User(age) values (20)"))
   t := f.KKOpenMysql()
  if t ==false {
      return  false
  }

  stmt, stErr := f.KKDb.Prepare(sqlString)
  if stErr == nil {
      _, err := stmt.Exec(sqlValues...)
      if err == nil {
        fmt.Println("数据插入成功!")
        return true
      }else{
        fmt.Println(err)
        fmt.Println("数据插入失败!")
        stmt.Close()
        return false
      }
  }else {
      fmt.Println("stmt 数据插入失败!")
      stmt.Close()
      return  false
  }
}

更新数据:

/*更新数据:

sqlString:sql语句,注意values?占位符
sqlValues:插入的的值
*/

func (f *MysqlDb)KKUpdataValues(sqlString string,sqlValues ...interface{}) bool {

  t := f.KKOpenMysql()
  if t ==false {
      return  false
  }

  stmt, stErr := f.KKDb.Prepare(sqlString)
  if stErr == nil {
      _,err := stmt.Exec(sqlValues ...)
      if err == nil {
        fmt.Println("数据更新成功!")
        stmt.Close()
        return  true
      }else {
        fmt.Println("数据更新失败!")
        stmt.Close()
        return  false
      }
  }else {
      fmt.Println("stmt 数据更新失败!")
      stmt.Close()
      return  true
  }
}

删除一条数据:

/*
删除一条数据:
sqlString:sql语句,注意values?占位符
sqlValues:插入的的值  https://github.com/jmoiron/sqlx 序列化
*/

func (f *MysqlDb)KKDeleteValues(sqlString string,sqlValues ...interface{}) bool {

  t := f.KKOpenMysql()
  if t ==false {
      return  false
  }

  stmt, stErr := f.KKDb.Prepare(sqlString)
  if stErr == nil {
      _,err := stmt.Exec(sqlValues ...)
      if err == nil {
        fmt.Println("数据删除成功!")
        stmt.Close()
        return true
      }else{
        fmt.Println("数据删除失败!")
        stmt.Close()
        return false
      }
  }else {
      fmt.Println("数据删除失败!")
      stmt.Close()
      return false
  }
}

查询数据

//取一行数据,注意这类取出来的结果都是string
func (f *MysqlDb)KKFetchRow( sqlstr string, args ...interface{}) (*map[string]string, error) {
  f.KKOpenMysql()
  stmtOut, err := f.KKDb.Prepare(sqlstr)
  if err != nil {
      panic(err.Error())
  }
  defer stmtOut.Close()
  rows, err := stmtOut.Query(args...)
  if err != nil {
      panic(err.Error())
  }
  columns, err := rows.Columns()
  if err != nil {
      panic(err.Error())
  }
  values := make([]sql.RawBytes, len(columns))
  scanArgs := make([]interface{}, len(values))
  ret := make(map[string]string, len(scanArgs))
  for i := range values {
      scanArgs[i] = &values[i]
  }
  for rows.Next() {
      err = rows.Scan(scanArgs...)
      if err != nil {
        panic(err.Error())
      }
      var value string
      for i, col := range values {
        if col == nil {
            value = "NULL"
        } else {
            value = string(col)
        }
        ret[columns[i]] = value
      }
      break //get the first row only
  }
  return &ret, nil
}

//取多行,注意这类取出来的结果都是string
func (f *MysqlDb)KKFetchRows(sqlstr string, args ...interface{}) (*[]map[string]string, error) {
  f.KKOpenMysql()
  stmtOut, err := f.KKDb.Prepare(sqlstr)
  if err != nil {
      panic(err.Error())
  }
  defer stmtOut.Close()
  rows, err := stmtOut.Query(args...)
  if err != nil {
      panic(err.Error())
  }
  // 数据库字段名字
  columns, err := rows.Columns()
  if err != nil {
      panic(err.Error())
  }
  values := make([]sql.RawBytes, len(columns))
  scanArgs := make([]interface{}, len(values))
  ret := make([]map[string]string, 0)
  for i := range values {
      scanArgs[i] = &values[i]
  }
  for rows.Next() {
      err = rows.Scan(scanArgs...)
      if err != nil {
        panic(err.Error())
      }
      var value string
      vmap := make(map[string]string, len(scanArgs))

      for i, col := range values {
        if col == nil {
            value = "NULL"
        } else {
            value = string(col)
        }
        vmap[columns[i]] = value
      }
      ret = append(ret, vmap)
  }
  return &ret, nil
}
上一篇 下一篇

猜你喜欢

热点阅读