Go 資料庫編程 一、連接資料庫 準備連接到資料庫 要想連接到 SQL 資料庫,首先需要載入目標資料庫的驅動,驅動裡面包含著於該資料庫交互的邏輯。 sql.Open() 資料庫驅動的名稱 數據源名稱 得到一個指向 sql.DB 這個 struct 的指針 sql.DB 是用來操作資料庫的,它代表了0 ...
Go 資料庫編程
一、連接資料庫
準備連接到資料庫
- 要想連接到 SQL 資料庫,首先需要載入目標資料庫的驅動,驅動裡面包含著於該資料庫交互的邏輯。
- sql.Open()
- 資料庫驅動的名稱
- 數據源名稱
- 得到一個指向 sql.DB 這個 struct 的指針
- sql.DB 是用來操作資料庫的,它代表了0個或者多個底層連接的池,這些連接由sql 包來維護,sql 包會自動的創建和釋放這些連接
- 它對於多個 goroutine 併發的使用是安全的
package main
import (
"context"
"database/sql"
"fmt"
"log"
_ "github.com/denisenkom/go-mssqldb"
)
var db *sql.DB
const (
server = "xxxx.database.windows.net"
port = 1433
user = "xxxxx"
password = "xxxxx"
database = "go-db"
)
func main() {
connStr := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;",
server, user, password, port, database)
db, err := sql.Open("sqlserver", connStr)
if err != nil {
log.Fataln(err.Error())
}
ctx := context.Background()
err = db.PingContext(ctx)
if err != nil {
log.Fataln(err.Error())
}
fmt.Println("Connected!")
}
Note
- Open() 函數並不會連接資料庫,甚至不會驗證其參數。它只是把後續連接到資料庫所必需的 structs 給設置好了
- 而真正的連接是在被需要的時候才進行懶設置的
- sql.DB 不需要進行關閉(當然你想關閉也是可以的)
- 它就是用來處理資料庫的,而不是實際的連接
- 這個抽象包含了資料庫連接的池,而且會對此進行維護
- 在使用 sql.DB 的時候,可以定義它的全局變數進行使用,也可以將它傳遞到函數/方法里。
如何獲得驅動
- 正常的做法是使用 sql.Register() 函數、資料庫驅動的名稱和一個實現了 driver.Driver 介面的 struct,來註冊資料庫的驅動。例如:
- 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。
Exercises
- 使用 PostgreSQL 建立資料庫,使用 Go 語言進行連接,並 Ping 一下。
- 使用 SQLite 建立資料庫,使用 Go 語言進行連接,並 Ping 一下。
連接MySQL
https://github.com/go-sql-driver/mysql
go get -u github.com/go-sql-driver/mysql
創建目錄
➜ mcd go_sql_demo
Code/go/go_sql_demo via