Golang MySQL 数据库开发
时间:2016-05-29 12:31 来源:linux.it.net.cn 作者:IT
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
(责任编辑:IT)
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 (责任编辑:IT) |