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/sqlxgithub.com/jmoiron/sqlx)
import (
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx" //sqlx 是一個開源的數據庫操作庫 大家可以去github看看噢
)
const (
//mysql
mysql_user = ""http://這里是數據庫用戶名
mysql_pass = ""http://這里是數據庫密碼
mysql_host = ""http://這里是數據庫主機
mysql_port = "3306"
database_name = ""http://這里是數據庫
)
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"http://sqlx 是一個開源的數據庫操作庫 大家可以去github看看噢
)
const(
//mysql
mysql_user=""http://這里是數據庫用戶名
mysql_pass=""http://這里是數據庫密碼
mysql_host=""http://這里是數據庫主機
mysql_port ="3306"
database_name=""http://這里是數據庫
)
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
本文由用戶 pfmm 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!