本文将講述如何使用 Go 語言連接配接 SQL(關系型)資料庫,以下簡稱為SQL 資料庫。
先看這個連接配接到 Microsoft SQL Server 資料庫的例子:

準備連接配接到資料庫
- 要想連接配接到 SQL 資料庫,首先需要加載目标資料庫的驅動,驅動裡面包含着與該資料庫互動的邏輯。
- 在驅動加載之後,需要調用 sql 包的 sql.Open() 函數,這将會得到一個指向 sql.DB 這個 struct 的指針。
- sql.Open() 函數的兩個參數分别是:
- 資料庫驅動的名稱(例如 Microsoft SQL Server 就是 sqlserver)
- 資料源名稱(資料庫連接配接字元串),不同資料庫驅動的資料源名稱也不一樣。
- sql.Open() 函數的兩個參數分别是:
- 一旦得到了 *sql.DB,我們就可以發送指令到目标資料,并擷取相應的結果。
- sql.DB 是用來操作資料庫的,它代表了 0 個或者多個底層連接配接的池,這些連接配接由 sql 包來維護,sql 包會自動的建立和釋放這些連接配接。
- 而且,它對于多個 goroutine 并發的使用是安全的。
- sql.DB 是用來操作資料庫的,它代表了 0 個或者多個底層連接配接的池,這些連接配接由 sql 包來維護,sql 包會自動的建立和釋放這些連接配接。
這裡需要注意的是:
- Open() 函數并不會連接配接資料庫,甚至不會驗證其參數。它隻是把後續連接配接到資料庫所必需的 structs 給設定好了。
- 而真正的連接配接是在被需要的時候才進行懶設定的。
此外:
- sql.DB 不需要進行關閉(當然你想關閉也是可以的)。
- 它就是用來處理資料庫的,而不是實際的連接配接。
- 這個抽象包含了資料庫連接配接的池,而且會對此進行維護。
在使用 sql.DB 的時候,可以定義它的全局變量進行使用,也可以将它傳遞函數/方法裡。
如何獲得驅動?
正常的做法是使用 sql.Register() 函數、資料庫驅動的名稱和一個實作了 driver.Driver 接口的 struct,來注冊資料庫的驅動。例如:
- Sql.Open() 函數的兩個參數分别是:
- 資料庫驅動的名稱(例如 Microsoft SQL Server 就是 sqlserver)
- 資料源名稱(資料庫連接配接字元串)
- sql.Register("sqlserver", &drv{})
但是我們之前的例子卻沒寫這句話,為什麼?
因為 Sql Server 的驅動,是在這個包被引入的時候進行了自我注冊:
- 當 go-mssqldb 包被引入到時候,它的 init 函數将會運作并進行自我注冊(在 Go 語言裡,每個包的 init 函數都會在自動的調用)。
- 在引入 go-mssqldb 包的時候,把該包的名設定為下劃線 _,這是因為我們不直接使用資料庫驅動(隻需要它起的“副作用”),我們隻使用 database/sql。
- 這樣,如果未來更新驅動,也無需改變代碼。
- Go 語言沒有提供官方的資料庫驅動,所有的資料庫驅動都是第三方驅動,但是它們都遵循 sql.driver 包裡面定義的接口。
安裝資料庫驅動
這是安裝 Microsoft SQL Server 資料庫驅動的例子:go get github.com/denisenkom/go-mssqldb
func (*DB) PingContext
- 上例中的 db.PingContext() 函數是用來驗證與資料庫的連接配接是否仍然有效,如有必要則建立一個連接配接。
- 這個函數需要一個 Context(上下文)類型的參數,這種類型可以攜帶截止時間、取消信号和其它請求範圍的值,并且可以橫跨 API 邊界和程序。
- 上例中,建立 context 使用的是 context.Background() 函數。該函數傳回一個非 nil 的空 Context。它不會被取消,它沒有值,沒有截止時間。
- 它通常用在 main 函數、初始化或測試中,作為傳入請求的頂級 Context。
如果例子程式可以成功連接配接到資料庫,那麼它的輸出結果就是:Connected!