Golang中如何對MySQL進(jìn)行操作詳解
前言
Golang官方并沒有提供數(shù)據(jù)庫驅(qū)動,但通過database/sql/driver包來提供了實(shí)現(xiàn)驅(qū)動的標(biāo)準(zhǔn)接口??梢栽贕ithub上找到很多開源的驅(qū)動。
其中g(shù)o-sql-driver/mysql是一個比較推薦的驅(qū)動,其完全支持database/sql接口。
使用這個驅(qū)動, 在項目里import進(jìn):
import ( "database/sql" _ "github.com/go-sql-driver/mysql" )
在正式使用database/sql包之前,首先得明白sql.DB并不代表一個數(shù)據(jù)庫連接,它并不會與數(shù)據(jù)庫建立任何連接,也不會驗證參數(shù)的合法性,要想知道DSN的合法性,需使用sql.DB實(shí)例(比如db)db.Ping() 方法, 如下:
err = db.Ping()
if err != nil {
// 錯誤處理
}
使用sql.Open()方法即可獲得一個sql.DB實(shí)例。需要注意的是,sql.DB的設(shè)計就是用來作為長連接使用的,不應(yīng)該在項目里頻繁的進(jìn)行Open()與Close(),提倡的做法是聲明一個全局的sql.DB實(shí)例, 將其復(fù)用起來。即只Open()一次,使用直到程序結(jié)束任務(wù)。
拿到sql.DB實(shí)例之后,就可以對數(shù)據(jù)庫進(jìn)行操作了。
在操作數(shù)據(jù)庫時,推薦做法是使用db.Prepare()對SQL語句進(jìn)行預(yù)編譯,這樣具有較高的安全性,可在一定程度上避免諸如SQL注入這樣的攻擊手段。
一些示例:
/*
查詢操作
*/
stmt, err := db.Prepare("SELECT `user_name` FROM `users` WHERE `id` = ?")
defer stmt.Close()
if err != nil {
//錯誤處理
}
var userName string
//Scan() 將結(jié)果復(fù)制到userName
err = stmt.QueryRow(1).Scan(&userName)
fmt.Println(userName)
/*
多行結(jié)果
*/
stmt, err := db.Prepare("SELECT `user_name` FROM `users` WHERE `age` = ?")
defer stmt.Close()
if err != nil {
//錯誤處理
}
rows, err := stmt.Query(年齡)
if err != nil {
//錯誤處理
}
for rows.Next() {
var userName string
if err := rows.Scan(&userName); err != nil {
//錯誤處理
}
}
/*
插入操作
*/
stmt, err := db.Prepare("INSERT INTO `users` (`user_name`, `age`) VALUES(?, ?)")
defer stmt.Close()
if err != nil {
//錯誤處理
}
stmt.Exec("名字",年齡)
/*
事務(wù)
*/
tx, err := db.Begin()
if err != nil {
//錯誤處理
}
defer tx.Rollback()
stmt, err := db.Prepare("")
defer stmt.Close()
if err != nil {
//錯誤處理
}
stmt.Exec()
err = tx.Commit()
if err != nil {
//錯誤處理
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
Golang迭代如何在Go中循環(huán)數(shù)據(jù)結(jié)構(gòu)使用詳解
這篇文章主要為大家介紹了Golang迭代之如何在Go中循環(huán)數(shù)據(jù)結(jié)構(gòu)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
golang 生成二維碼海報的實(shí)現(xiàn)代碼
這篇文章主要介紹了golang 生成二維碼海報的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02

