Golang MySQL 数据库开发

pfmm 7年前


MySQL以免费、开源、使用方便为优势成为了很多Web开发的后端数据库存储引擎。数据库操作是Web开发中占有极其重要的一部分。数据也是程序最核心的东西。

Go语言作为一门新兴语言他是怎么对Mysql进行开发的呢。

MySQL驱动:

Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种:

首先我们建立数据库连接:(我在项目中使用了

github.com/jmoiron/sqlx
github.com/jmoiron/sqlx

)

import (    _ "github.com/go-sql-driver/mysql"    "github.com/jmoiron/sqlx" //sqlx 是一个开源的数据库操作库 大家可以去github看看噢  )    const (    //mysql    mysql_user = ""//这里是数据库用户名    mysql_pass = ""//这里是数据库密码    mysql_host = ""//这里是数据库主机      mysql_port    = "3306"    database_name = ""//这里是数据库  )    var (    db  *sqlx.DB    err error  )    func reconnect() {    if db != nil && db.Ping() == nil {      return    }    db, err = sqlx.Open("mysql", mysql_user+":"+mysql_pass+"@tcp("+mysql_host+":"+mysql_port+")/"+database_name)    if err != nil {      panic(err)    }    db.SetMaxOpenConns(20)    db.SetMaxIdleConns(10)    }  func GetConn() *sqlx.DB {    reconnect()    return db  }

import(  _"github.com/go-sql-driver/mysql"  "github.com/jmoiron/sqlx"//sqlx 是一个开源的数据库操作库 大家可以去github看看噢  )     const(  //mysql  mysql_user=""//这里是数据库用户名  mysql_pass=""//这里是数据库密码  mysql_host=""//这里是数据库主机     mysql_port    ="3306"  database_name=""//这里是数据库  )     var(  db  *sqlx.DB  err error  )     func reconnect(){  ifdb!=nil&&db.Ping()==nil{  return  }  db,err=sqlx.Open("mysql",mysql_user+":"+mysql_pass+"@tcp("+mysql_host+":"+mysql_port+")/"+database_name)  iferr!=nil{  panic(err)  }  db.SetMaxOpenConns(20)  db.SetMaxIdleConns(10)     }  func GetConn()*sqlx.DB{  reconnect()  returndb  }

如下示例将示范如何使用database/sql接口对数据库表进行增删改查操作:

 func Insert(){  GetConn()        //插入数据      stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")      checkErr(err)        res, err := stmt.Exec("astaxie", "研发部门", "2012-12-09")      checkErr(err)        id, err := res.LastInsertId()      checkErr(err)        fmt.Println(id)//当id大于0的时候 说明数据插入成功  }  func Update(){  GetConn()       //更新数据      stmt, err = db.Prepare("update userinfo set username=? where uid=?")      checkErr(err)        res, err = stmt.Exec("astaxieupdate", id)      checkErr(err)        affect, err := res.RowsAffected()      checkErr(err)        fmt.Println(affect)//当affect大于0的时候 说明数更新成功    }    func Delete(){  GetConn()       //删除数据      stmt, err = db.Prepare("delete from userinfo where uid=?")      checkErr(err)        res, err = stmt.Exec(id)      checkErr(err)        affect, err = res.RowsAffected()      checkErr(err)        fmt.Println(affect)//当affect大于0的时候 说明删除成功         }  func Select(){    //database/sql的查询操作   //查询数据      rows, err := db.Query("SELECT * FROM userinfo")      checkErr(err)        for rows.Next() {          var uid int          var username string          var department string          var created string          err = rows.Scan(&uid, &username, &department, &created)          checkErr(err)          fmt.Println(uid)          fmt.Println(username)          fmt.Println(department)          fmt.Println(created)      }      //这是 Sqlx的查询操作 比上面的要简单(个人建议使用sqlx库进行数据库开发)  p := Place{}  pp := []Place{}     // this will pull the first place directly into p  err = db.Get(&p, "SELECT * FROM place LIMIT 1")     // this will pull places with telcode > 50 into the slice pp  err = db.Select(&pp, "SELECT * FROM place WHERE telcode > ?", 50)     // they work with regular types as well  var id int  err = db.Get(&id, "SELECT count(*) FROM place")     // fetch at most 10 place names  var names []string  err = db.Select(&names, "SELECT name FROM place LIMIT 10")      }  func checkErr(err error) {      if err != nil {          panic(err)      }  }    func Insert(){  GetConn()      //插入数据    stmt,err:=db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")    checkErr(err)    res,err:=stmt.Exec("astaxie","研发部门","2012-12-09")    checkErr(err)    id,err:=res.LastInsertId()    checkErr(err)    fmt.Println(id)//当id大于0的时候 说明数据插入成功  }  func Update(){  GetConn()     //更新数据    stmt,err=db.Prepare("update userinfo set username=? where uid=?")    checkErr(err)    res,err=stmt.Exec("astaxieupdate",id)    checkErr(err)    affect,err:=res.RowsAffected()    checkErr(err)    fmt.Println(affect)//当affect大于0的时候 说明数更新成功  }  func Delete(){  GetConn()     //删除数据    stmt,err=db.Prepare("delete from userinfo where uid=?")    checkErr(err)    res,err=stmt.Exec(id)    checkErr(err)    affect,err=res.RowsAffected()    checkErr(err)    fmt.Println(affect)//当affect大于0的时候 说明删除成功  }  func Select(){    //database/sql的查询操作  //查询数据    rows,err:=db.Query("SELECT * FROM userinfo")    checkErr(err)    forrows.Next(){      varuidint      varusernamestring      vardepartmentstring      varcreatedstring      err=rows.Scan(&uid,&username,&department,&created)      checkErr(err)      fmt.Println(uid)      fmt.Println(username)      fmt.Println(department)      fmt.Println(created)    }    //这是 Sqlx的查询操作 比上面的要简单(个人建议使用sqlx库进行数据库开发)  p:=Place{}  pp:=[]Place{}  // this will pull the first place directly into p  err=db.Get(&p,"SELECT * FROM place LIMIT 1")  // this will pull places with telcode > 50 into the slice pp  err=db.Select(&pp,"SELECT * FROM place WHERE telcode > ?",50)  // they work with regular types as well  varidint  err=db.Get(&id,"SELECT count(*) FROM place")  // fetch at most 10 place names  varnames[]string  err=db.Select(&names,"SELECT name FROM place LIMIT 10")  }  func checkErr(errerror){    iferr!=nil{      panic(err)    }  }

其中一些示例参考了 https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/05.2.md