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 = ""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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!