Golang 學習筆記(10)—— mysql操作

本文為轉(zhuǎn)載,原文:Golang 學習筆記(10)—— mysql操作

Golang

go-sql-driver/mysql

go操作mysql的驅(qū)動包很多,這里講解當下比較流行的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ù)據(jù)庫

在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ù)據(jù)庫?charset=utf8")

insert

有2種方法。

  1. 直接使用Exec函數(shù)添加
result, err := db.Exec("INSERT INTO userinfo (username, departname, created) VALUES (?, ?, ?)","chain","dev","2018-01-04")
  1. 首先使用Prepare獲得stmt,然后調(diào)用Exec添加
stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
res, err := stmt.Exec("iris", "test", "2018-01-04")
  • 另一個經(jīng)常用到的功能,獲得剛剛添加數(shù)據(jù)的自增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ù)據(jù)
*/
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
}
運行結(jié)果

數(shù)據(jù)庫結(jié)果

delete

與insert所用的方法一致,只是將sql語句改為對應的功能就行。

func main(){
    Delete(15)
}
/*
  根據(jù)id刪除數(shù)據(jù)
*/
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
}
運行結(jié)果

數(shù)據(jù)庫結(jié)果

update

與insert所用的方法一致,只是將sql語句改為對應的功能就行。

func main(){
    UpdateName(13,"chairis")
}
/*
  根據(jù)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
}
運行結(jié)果

數(shù)據(jù)庫結(jié)果

select

  • 查詢單條數(shù)據(jù),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)
}
運行結(jié)果
  • 查詢多條數(shù)據(jù),并遍歷
    Query 獲取數(shù)據(jù),for xxx.Next() 遍歷數(shù)據(jù)
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)
        }
    }
}
運行結(jié)果

事務

在操作數(shù)據(jù)庫之前執(zhí)行,db.Begin()
例:tx, err := db.Begin()
保存到數(shù)據(jù)庫:err := tx.Commit()
回滾:err := tx.Rollback()
注意設(shè)置事務以后操作數(shù)據(jù)庫就不是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
    }
}
運行結(jié)果

全部代碼

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ù)據(jù)
*/
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
}

/*
  根據(jù)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
}

/*
  根據(jù)id刪除數(shù)據(jù)
*/
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)
    }
}

源碼

github 源碼地址

轉(zhuǎn)載請注明出處:
Golang 學習筆記(10)—— mysql操作

目錄
上一節(jié):Golang 學習筆記(09)—— json和xml解析
下一節(jié):Golang 學習筆記(11)—— 反射

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容