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