Go語言實現(xiàn)操作MySQL的基礎(chǔ)知識總結(jié)
前言
MySQL 是目前開發(fā)中最常見的關(guān)系型數(shù)據(jù)庫,也是程序員打交道最多的數(shù)據(jù)庫。 使用 Go 語言進(jìn)行操控數(shù)據(jù)庫需要使用 Go 自帶database/sql
和驅(qū)動go-sql-driver/mysql
來實現(xiàn)。這篇文章主要總結(jié)一下怎么使用Go語言操作MySql數(shù)據(jù)庫,需要的朋友可以參考以下內(nèi)容,希望對大家有幫助。
下載依賴
database/sql
是Go操作數(shù)據(jù)庫的標(biāo)準(zhǔn)庫之一,它提供了一系列接口方法,用于訪問數(shù)據(jù)庫(mysql,sqllite,oralce),但是它并不會提供數(shù)據(jù)庫特有的方法,那些特有的方法需要交給數(shù)據(jù)庫驅(qū)動去處理。
我們在通常工作中,用的更多的是jmoiron/sqlx包來操作數(shù)據(jù)庫,sqlx是基于標(biāo)準(zhǔn)庫的擴(kuò)展,并且我們可以通過sqlx操作各種類型的數(shù)據(jù)。
go get -u github.com/go-sql-driver/mysql go get -u github.com/jmoiron/sqlx
使用 MySQL 驅(qū)動
Open
打開一個 dirverName
指定的數(shù)據(jù)庫,dataSourceName
指定數(shù)據(jù)源,一般至少包括數(shù)據(jù)庫文件名和其它連接必要的信息。
func Open(driverName, dataSourceName string) (*DB, error)
它返回的是一個sql.DB
數(shù)據(jù)庫類型,它不是數(shù)據(jù)庫連接,Go 中的連接來自內(nèi)部實現(xiàn)的連接池,連接的建立是惰性的,連接將會在操作的時候,由連接池創(chuàng)建并維護(hù),它可以安全地被多個goroutine同時使用。
示例:
package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) var db *sql.DB //聲明一個全局的 db 變量 func main() { // 初始化 MySQL err := initDB() if err != nil { panic(err) } defer db.Close() // 注意這行代碼要寫在上面err判斷的下面 } //initDB 初始化MySQL func initDB() (err error) { // 不會校驗賬號密碼是否正確 db, err = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test") if err != nil { return err } // 嘗試與數(shù)據(jù)庫建立連接(校驗dsn是否正確) err = db.Ping() if err != nil { return err } return nil }
注意:
sql.Open
只會驗證格式是否正確,不會連接數(shù)據(jù)庫。db.Ping
會連接數(shù)據(jù)庫,判斷用戶,密碼,ip地址,端口是否正確。db.Close
在err
之后,是因為可能打開不成功,關(guān)閉一個沒有打開的連接。
SetMaxOpenConns
func (db *DB) SetMaxOpenConns(n int)
SetMaxOpenConns
設(shè)置與數(shù)據(jù)庫建立連接的最大數(shù)目。 如果n大于0且小于最大閑置連接數(shù),會將最大閑置連接數(shù)減小到匹配最大開啟連接數(shù)的限制。 如果n<=0,不會限制最大開啟連接數(shù),默認(rèn)為0(無限制)。
SetMaxIdleConns
func (db *DB) SetMaxIdleConns(n int)
SetMaxIdleConns
設(shè)置連接池中的最大閑置連接數(shù)。 如果n大于最大開啟連接數(shù),則新的最大閑置連接數(shù)會減小到匹配最大開啟連接數(shù)的限制。 如果n<=0,不會保留閑置連接。
操作
func (db *DB) Query(query string, args ...interface{}) (*Rows, error) func (db *DB) QueryRow(query string, args ...interface{}) *Row func (db *DB) Exec(query string, args ...interface{}) (Result, error) func (db *DB) Prepare(query string) (*Stmt, error)
db.Query()
: 返回多行數(shù)據(jù),需要依次遍歷,并且需要自己關(guān)閉查詢結(jié)果集。
db.QueryRow()
:專門查詢一行數(shù)據(jù)語法,返回ErrNoRow
或者一行數(shù)據(jù),不需要自己關(guān)閉結(jié)果集。
db.Exec()
:用于執(zhí)行insert
、update
、delete
等不需要返回結(jié)果集的操作。
db.Prepare()
:預(yù)先將一個數(shù)據(jù)庫連接(con)
和一個條sql
語句綁定并返回stmt
結(jié)構(gòu)體代表這個綁定后的連接,然后運(yùn)行stmt.Query()
或者stmt.QueryRow()
;stmt
是并發(fā)安全的。之所以這樣設(shè)計,是因為每次直接調(diào)用db.Prepare都會自動選擇一個可用的con
,每次選擇的可能不是同一個con
。
到此這篇關(guān)于Go語言實現(xiàn)操作MySQL的基礎(chǔ)知識總結(jié)的文章就介紹到這了,更多相關(guān)Go語言操作MySQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang中package?is?not?in?GOROOT報錯的真正解決辦法
這篇文章主要給大家介紹了關(guān)于golang中package?is?not?in?GOROOT報錯的真正解決辦法,文中通過圖文介紹的非常詳細(xì),對同樣遇到這個問題的朋友具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-03-03關(guān)于go-micro與其它gRPC框架之間的通信問題及解決方法
在之前的文章中分別介紹了使用gRPC官方插件和go-micro插件開發(fā)gRPC應(yīng)用程序的方式,都能正常走通。不過當(dāng)兩者混合使用的時候,互相訪問就成了問題,下面通過本文給大家講解下go-micro與gRPC框架通信問題,一起看看吧2022-04-04Go語言學(xué)習(xí)之將mp4通過rtmp推送流媒體服務(wù)的實現(xiàn)方法
對音視頻一直是小白,決定沉下心來,好好研究一下音視頻知識,下面這篇文章主要給大家介紹了關(guān)于Go語言學(xué)習(xí)之將mp4通過rtmp推送流媒體服務(wù)的實現(xiàn)方法,需要的朋友可以參考下2022-12-12