转载

Golang MySQL 数据库开发

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

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

MySQL驱动:

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

  • https://github.com/go-sql-driver/mysql 支持database/sql,全部采用go写。
  • https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用go写。
  • https://github.com/Philio/GoMySQL 不支持database/sql,自定义接口,全部采用go写。

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

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

Golang MySQL 数据库开发

正文到此结束
Loading...