本文為轉載,原文:Golang 學習筆記(10)—— mysql操作
Golang
go-sql-driver/mysql
go操作mysql的驅動包很多,這里講解當下比較流行的go-sql-driver/mysql
安裝
執(zhí)行下面兩個命令:
go get github.com/go-sql-driver/mysql //下載
go install github.com/go-sql-driver/mysql //安裝
安裝完成以后的文件截圖
安裝完成
安裝完成
使用
package
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
數(shù)據庫
在mysql中建一張測試的表璧疗,sql如下:
CREATE TABLE `userinfo` (
`uid` INT(10) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(64) NULL DEFAULT NULL,
`departname` VARCHAR(64) NULL DEFAULT NULL,
`created` DATE NULL DEFAULT NULL,
PRIMARY KEY (`uid`)
)
連接
db, err := sql.Open("mysql", "用戶名:密碼@tcp(IP:端口)/數(shù)據庫?charset=utf8")
insert
有2種方法皆的。
- 直接使用Exec函數(shù)添加
result, err := db.Exec("INSERT INTO userinfo (username, departname, created) VALUES (?, ?, ?)","chain","dev","2018-01-04")
- 首先使用Prepare獲得stmt,然后調用Exec添加
stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
res, err := stmt.Exec("iris", "test", "2018-01-04")
- 另一個經常用到的功能究恤,獲得剛剛添加數(shù)據的自增ID
id, err := res.LastInsertId()
- 示例
package main
import (
"time"
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var (
dbhost = "xxx.xxx.xxx.xxx:3306"
dbusername = "xxxx"
dbpassword = "xxxx"
dbname = "xxx"
)
func main(){
Insert("chain", "dev", "1")
Insert("chain", "dev", "2")
Insert("iris", "test", "1")
Insert("iris", "test", "2")
}
/*
獲取sql.DB對象
*/
func GetDB() *sql.DB{
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", dbusername, dbpassword, dbhost, dbname))
CheckErr(err)
return db
}
/*
插入數(shù)據
*/
func Insert(username, departname, method string)bool{
db := GetDB()
defer db.Close()
if method == "1"{
_, err := db.Exec("insert into userinfo(username,departname,created) values(?,?,?)",username,departname,time.Now())
if err != nil{
fmt.Println("insert err: ", err.Error())
return false
}
fmt.Println("insert success!")
return true
}else if method == "2"{
stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
if err != nil{
fmt.Println("insert prepare error: ", err.Error())
return false
}
_, err = stmt.Exec(username, departname, time.Now())
if err != nil{
fmt.Println("insert exec error: ", err.Error())
return false
}
fmt.Println("insert success!")
return true
}
return false
}
運行結果
數(shù)據庫結果
delete
與insert所用的方法一致俭令,只是將sql語句改為對應的功能就行。
func main(){
Delete(15)
}
/*
根據id刪除數(shù)據
*/
func Delete(id int) bool {
db := GetDB()
defer db.Close()
stmt, err := db.Prepare("delete from userinfo where uid=?")
if err != nil{
fmt.Println("delete prepare error: ", err.Error())
return false
}
_, err = stmt.Exec(id)
if err != nil{
fmt.Println("delete exec error: ", err.Error())
return false
}
fmt.Println("delete success!")
return true
}
運行結果
數(shù)據庫結果
update
與insert所用的方法一致部宿,只是將sql語句改為對應的功能就行抄腔。
func main(){
UpdateName(13,"chairis")
}
/*
根據id瓢湃,修改名稱
*/
func UpdateName(id int, name string)bool{
db := GetDB()
defer db.Close()
stmt, err := db.Prepare("update userinfo set username=? where uid=?")
if err != nil{
fmt.Println("update name prepare error: ", err.Error())
return false
}
_, err = stmt.Exec(name, id)
if err != nil{
fmt.Println("update name exec error: ", err.Error())
return false
}
fmt.Println("update name success!")
return true
}
運行結果
數(shù)據庫結果
select
- 查詢單條數(shù)據,QueryRow 函數(shù)
func main(){
GetOne(13)
}
func GetOne(id int){
db := GetDB()
defer db.Close()
var username, departname, created string
err := db.QueryRow("select username, departname, created from userinfo where uid=?",id).Scan(&username, &departname, &created)
if err != nil{
fmt.Println("get one error: ", err.Error())
return
}
fmt.Println("username: ", username, "departname: ", departname, "created: ", created)
}
運行結果
- 查詢多條數(shù)據赫蛇,并遍歷
Query 獲取數(shù)據绵患,for xxx.Next() 遍歷數(shù)據
func main(){
GetAll()
}
func GetAll(){
db := GetDB()
defer db.Close()
rows, err := db.Query("select username, departname, created from userinfo")
if err != nil{
fmt.Println("get all error: ", err.Error())
return
}
for rows.Next(){
var username, departname, created string
if err := rows.Scan(&username, &departname, &created); err == nil{
fmt.Println("username: ", username, "departname: ", departname, "created: ", created)
}
}
}
運行結果
事務
在操作數(shù)據庫之前執(zhí)行,db.Begin()
例:tx, err := db.Begin()
保存到數(shù)據庫:err := tx.Commit()
回滾:err := tx.Rollback()
注意設置事務以后操作數(shù)據庫就不是db了悟耘,而是tx
請看以下示例:
func main(){
Trans()
}
func Trans(){
db := GetDB()
defer db.Close();
tx, err := db.Begin()
if err != nil{
fmt.Println("db.Begin error: ", err.Error())
return
}
isCommit := true
defer func(){
if isCommit{
tx.Commit()
fmt.Println("commit")
}else{
tx.Rollback()
fmt.Println("Rollback")
}
}()
_, err = tx.Exec("insert into userinfo(username,departname,created) values(?,?,?)","username","departname",time.Now())
if err != nil{
isCommit = false
}
_, err = tx.Exec("insert into userinfo(username,departname,created) values(?,?,?)","username","departname",time.Now())
if err != nil{
isCommit = false
}
_, err = tx.Exec("insert into userinfo(username,departname,created) values(?,?,?)","username","departname",time.Now())
if err != nil{
isCommit = false
}
}
運行結果
全部代碼
package main
import (
"time"
"fmt"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var (
dbhost = "xxx.xxx.xxx.xxx:3306"
dbusername = "xxxxxx"
dbpassword = "xxxxxx"
dbname = "xxxxxx"
)
func main(){
Trans()
}
func Trans(){
db := GetDB()
defer db.Close();
tx, err := db.Begin()
if err != nil{
fmt.Println("db.Begin error: ", err.Error())
return
}
isCommit := true
defer func(){
if isCommit{
tx.Commit()
fmt.Println("commit")
}else{
tx.Rollback()
fmt.Println("Rollback")
}
}()
_, err = tx.Exec("insert into userinfo(username,departname,created) values(?,?,?)","username","departname",time.Now())
if err != nil{
isCommit = false
}
_, err = tx.Exec("insert into userinfo(username,departname,created) values(?,?,?)","username","departname",time.Now())
if err != nil{
isCommit = false
}
_, err = tx.Exec("insert into userinfo(username,departname,created) values(?,?,?)","username","departname",time.Now())
if err != nil{
isCommit = false
}
}
/*
獲取sql.DB對象
*/
func GetDB() *sql.DB{
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", dbusername, dbpassword, dbhost, dbname))
CheckErr(err)
return db
}
/*
插入數(shù)據
*/
func Insert(username, departname, method string)bool{
db := GetDB()
defer db.Close()
if method == "1"{
_, err := db.Exec("insert into userinfo(username,departname,created) values(?,?,?)",username,departname,time.Now())
if err != nil{
fmt.Println("insert err: ", err.Error())
return false
}
fmt.Println("insert success!")
return true
}else if method == "2"{
stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
if err != nil{
fmt.Println("insert prepare error: ", err.Error())
return false
}
_, err = stmt.Exec(username, departname, time.Now())
if err != nil{
fmt.Println("insert exec error: ", err.Error())
return false
}
fmt.Println("insert success!")
return true
}
return false
}
/*
根據id落蝙,修改名稱
*/
func UpdateName(id int, name string)bool{
db := GetDB()
defer db.Close()
stmt, err := db.Prepare("update userinfo set username=? where uid=?")
if err != nil{
fmt.Println("update name prepare error: ", err.Error())
return false
}
_, err = stmt.Exec(name, id)
if err != nil{
fmt.Println("update name exec error: ", err.Error())
return false
}
fmt.Println("update name success!")
return true
}
/*
根據id刪除數(shù)據
*/
func Delete(id int) bool {
db := GetDB()
defer db.Close()
stmt, err := db.Prepare("delete from userinfo where uid=?")
if err != nil{
fmt.Println("delete prepare error: ", err.Error())
return false
}
_, err = stmt.Exec(id)
if err != nil{
fmt.Println("delete exec error: ", err.Error())
return false
}
fmt.Println("delete success!")
return true
}
func GetOne(id int){
db := GetDB()
defer db.Close()
var username, departname, created string
err := db.QueryRow("select username, departname, created from userinfo where uid=?",id).Scan(&username, &departname, &created)
if err != nil{
fmt.Println("get one error: ", err.Error())
return
}
fmt.Println("username: ", username, "departname: ", departname, "created: ", created)
}
func GetAll(){
db := GetDB()
defer db.Close()
rows, err := db.Query("select username, departname, created from userinfo")
if err != nil{
fmt.Println("get all error: ", err.Error())
return
}
for rows.Next(){
var username, departname, created string
if err := rows.Scan(&username, &departname, &created); err == nil{
fmt.Println("username: ", username, "departname: ", departname, "created: ", created)
}
}
}
func CheckErr(err error){
if err != nil{
fmt.Println("err: ", err.Error())
panic(err)
}
}
源碼
完
轉載請注明出處:
Golang 學習筆記(10)—— mysql操作
目錄
上一節(jié):Golang 學習筆記(09)—— json和xml解析
下一節(jié):Golang 學習筆記(11)—— 反射