天天看點

go init函數_Go 語言如何連接配接關系型資料庫準備連接配接到資料庫如何獲得驅動?func (*DB) PingContext

本文将講述如何使用 Go 語言連接配接 SQL(關系型)資料庫,以下簡稱為SQL 資料庫。

先看這個連接配接到 Microsoft SQL Server 資料庫的例子:

go init函數_Go 語言如何連接配接關系型資料庫準備連接配接到資料庫如何獲得驅動?func (*DB) PingContext

準備連接配接到資料庫

  • 要想連接配接到 SQL 資料庫,首先需要加載目标資料庫的驅動,驅動裡面包含着與該資料庫互動的邏輯。
  • 在驅動加載之後,需要調用 sql 包的     sql.Open() 函數,這将會得到一個指向 sql.DB 這個 struct 的指針。
    • sql.Open()      函數的兩個參數分别是:
      • 資料庫驅動的名稱(例如 Microsoft SQL Server 就是 sqlserver)
      • 資料源名稱(資料庫連接配接字元串),不同資料庫驅動的資料源名稱也不一樣。
  • 一旦得到了 *sql.DB,我們就可以發送指令到目标資料,并擷取相應的結果。
    • sql.DB 是用來操作資料庫的,它代表了 0 個或者多個底層連接配接的池,這些連接配接由 sql 包來維護,sql 包會自動的建立和釋放這些連接配接。
      • 而且,它對于多個 goroutine 并發的使用是安全的。

這裡需要注意的是:

  • Open()     函數并不會連接配接資料庫,甚至不會驗證其參數。它隻是把後續連接配接到資料庫所必需的 structs     給設定好了。
  • 而真正的連接配接是在被需要的時候才進行懶設定的。

此外:

  • sql.DB     不需要進行關閉(當然你想關閉也是可以的)。
  • 它就是用來處理資料庫的,而不是實際的連接配接。
  • 這個抽象包含了資料庫連接配接的池,而且會對此進行維護。

在使用 sql.DB 的時候,可以定義它的全局變量進行使用,也可以将它傳遞函數/方法裡。

如何獲得驅動?

正常的做法是使用 sql.Register() 函數、資料庫驅動的名稱和一個實作了 driver.Driver 接口的 struct,來注冊資料庫的驅動。例如:

  • Sql.Open()     函數的兩個參數分别是:
    • 資料庫驅動的名稱(例如      Microsoft SQL Server 就是 sqlserver)
    • 資料源名稱(資料庫連接配接字元串)
  • sql.Register("sqlserver",     &drv{})

但是我們之前的例子卻沒寫這句話,為什麼?

因為 Sql Server 的驅動,是在這個包被引入的時候進行了自我注冊:

go init函數_Go 語言如何連接配接關系型資料庫準備連接配接到資料庫如何獲得驅動?func (*DB) PingContext
  • 當 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!

繼續閱讀