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注入這樣的攻擊手段。
一些示例:
/*
查詢操作
*/
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)文章
使用Go和Gorm實(shí)現(xiàn)讀取SQLCipher加密數(shù)據(jù)庫(kù)
本文檔主要描述通過(guò)Go和Gorm實(shí)現(xiàn)生成和讀取SQLCipher加密數(shù)據(jù)庫(kù)以及其中踩的一些坑,文章通過(guò)代碼示例講解的非常詳細(xì), 對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06
Golang中int類型和字符串類型相互轉(zhuǎn)換的實(shí)現(xiàn)方法
在日常開(kāi)發(fā)中,經(jīng)常需要將數(shù)字轉(zhuǎn)換為字符串或者將字符串轉(zhuǎn)換為數(shù)字,在 Golang 中,有一些很簡(jiǎn)便的方法可以實(shí)現(xiàn)這個(gè)功能,接下來(lái)就詳細(xì)講解一下如何實(shí)現(xiàn) int 類型和字符串類型之間的互相轉(zhuǎn)換,需要的朋友可以參考下2023-09-09
golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms)
這篇文章主要介紹了golang使用map支持高并發(fā)的方法(1000萬(wàn)次操作14ms),本文給大家詳細(xì)講解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
golang中range在slice和map遍歷中的注意事項(xiàng)
今天小編就為大家分享一篇關(guān)于golang中range在slice和map遍歷中的注意事項(xiàng),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
Golang開(kāi)發(fā)gRPC服務(wù)入門介紹
這篇文章主要介紹了Golang開(kāi)發(fā)gRPC服務(wù),Golang開(kāi)發(fā)gRPC應(yīng)用程序的套路也已經(jīng)很清晰,這篇文章就來(lái)做一個(gè)簡(jiǎn)單的介紹,算是入門,需要的朋友可以參考下2022-04-04
讓GPT教你用go語(yǔ)言和C語(yǔ)言開(kāi)發(fā)IDE配置學(xué)習(xí)
這篇文章主要介紹了讓GPT教你用go語(yǔ)言和C語(yǔ)言開(kāi)發(fā)IDE配置學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

