操作 資料庫
Go 語言中的 database/sql 包定義了對資料庫的一系列操作,database/sql/driver
包定義了應被資料庫驅動實作的介面,這些介面會被 sql 包使用,但是 Go 語言沒有提
供任何官方的資料庫驅動,所以我們需要匯入第三方的資料庫驅動,不過我們連接資料
庫之后對資料庫操作的大部分代碼都使用 sql 包,
獲取資料庫連接
Open 函式的說明
- 引數 dataSourceName 的格式:
資料庫用戶名:資料庫密碼@[tcp(localhost:3306)]/資料庫名 - Open 函式可能只是驗證其引數,而不創建與資料庫的連接,如果要檢查資料
源的名稱是否合法,應呼叫回傳值的 Ping 方法, - 回傳的 DB 可以安全的被多個 go 程同時使用,并會維護自身的閑置連接池,
這樣一來,Open 函式只需呼叫一次,很少需要關閉 DB
package utils
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var (
Db *sql.DB
err error
)
func init() {
Db, err = sql.Open("mysql", "root:ygj1007502524@tcp(localhost:3306)/test")
if err != nil {
panic(err.Error())
}
}
增刪改操作
在連接的 test 資料庫中創建一個 users 表
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100) UNIQUE NOT NULL,
PASSWORD VARCHAR(100) NOT NULL,
email VARCHAR(100)
)
向 users 表中插入記錄
package model
import (
"fmt"
"go_code/go-web/day01/web01_db/utils"
)
//User 結構體
type User struct {
ID int
Username string
Password string
Email string
}
//AddUser 添加User的方法一
func (user *User) AddUser() error {
//1.寫sql陳述句
sqlStr := "insert into users(username,password,email) values(?,?,?)"
//2.預編譯
inStmt, err := utils.Db.Prepare(sqlStr)
if err != nil {
fmt.Println("預編譯出現例外:", err)
return err
}
//3.執行
_, err2 := inStmt.Exec("admin", "123456", "[email protected]")
if err2 != nil {
fmt.Println("執行出現例外:", err2)
return err
}
return nil
}
//AddUser2 添加User的方法二
func (user *User) AddUser2() error {
//1.寫sql陳述句
sqlStr := "insert into users(username,password,email) values(?,?,?)"
//2.執行
_, err := utils.Db.Exec(sqlStr, "admin2", "666666", "[email protected]")
if err != nil {
fmt.Println("執行出現例外:", err)
return err
}
return nil
}
單元測驗
簡介
顧名思義,單元測驗( unit test),就是一種為驗證單元的正確性而設定的自動化測
試,一個單元就是程式中的一個模塊化部分,一般來說,一個單元通常會與程式中的一
個函式或者一個方法相對應,但這并不是必須的,Go 的單元測驗需要用到 testing 包
以及 go test 命令,而且對測驗檔案也有以下要求
- 被測驗的源檔案和測驗檔案必須位于同一個包下
- 測驗檔案必須要以_test.go 結尾
- 雖然 Go 對測驗檔案_test.go 的前綴沒有強制要求,不過一般我們都設定
為被測驗的檔案的檔案名,如:要對 user.go 進行測驗,那么測驗檔案的
名字我們通常設定為 user_test.go
- 測驗檔案中的測驗函式為 TestXxx(t *testing.T)
- 其中 Xxx 的首字母必須是大寫的英文字母
- 函式引數必須是 test.T 的指標型別(如果是 Benchmark 測驗則引數是
testing.B 的指標型別)
測驗代碼:
package model
import (
"fmt"
"testing"
)
//TestMain函式可以在測驗函式執行之前做一些其他操作
func TestMain(m *testing.M) {
fmt.Println("測驗開始:")
//通過m.Run()來執行測驗函式
m.Run()
}
func TestUser(t *testing.T) {
fmt.Println("開始測驗User中的相關方法")
//通過t.Run()來執行子測驗函式
t.Run("測驗添加用戶:", testAddUser)
}
//如果函式名不是以Test開頭,那么該函式默認不執行,我們可以將它設定成為一個子測驗函式
func testAddUser(t *testing.T) {
fmt.Println("子測驗函式執行:")
user := &User{}
//呼叫添加用戶的方法
user.AddUser()
user.AddUser2()
}
testing 包的說明
如果一個測驗函式的函式名的不是以 Test 開頭,那么在使用 go test 命令時默
認不會執行,不過我們可以設定該函式時一個子測驗函式,可以在其他測驗函
我們還可以通過 TestMain(m *testing.M)函式在測驗之前和之后做一些其他
的操作
a) 測驗檔案中有 TestMain 函式時,執行 go test 命令將直接運行 TestMain
函式,不直接運行測驗函式,只有在 TestMain 函式中執行 m.Run()時才
會執行測驗函式
b) 如果想查看測驗的詳細程序,可以使用 go test -v 命令
獲取一條記錄
func (user *User) GetUserByID(userId int) (*User, error) {
//寫 sql 陳述句
sqlStr := "select id , username , password , email from users where id = ?"
//執行 sql
row := utils.Db.QueryRow(sqlStr, userId)
//宣告三個變數
var username string
var password string
var email string
//將各個欄位中的值讀到以上三個變數中
err := row.Scan(&userId, &username, &password, &email)
if err != nil {
return nil, err
}
//將三個變數的值賦給 User 結構體
u := &User{
ID: userId,
Username: username,
Password: password,
Email: email,
}
return u, nil
}
獲取多條記錄
func (user *User) GetUsers() ([]*User, error) {
//寫 sql 陳述句
sqlStr := "select id , username , password , email from users"
//執行 sql
rows, err := utils.Db.Query(sqlStr)
if err != nil {
return nil, err
}
//定義一個 User 切片
var users []*User
//遍歷
for rows.Next() {
//宣告四個個變數
var userID int
var username string
var password string
var email string
//將各個欄位中的值讀到以上三個變數中
err := rows.Scan(&userID, &username, &password, &email)
if err != nil {
return nil, err
}
//將三個變數的值賦給 User 結構體
u := &User{
ID: userID,
Username: username,
Password: password,
Email: email,
}
//將 u 添加到 users 切片中
users = append(users, u)
}
return users, nil
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/55021.html
標籤:Go
下一篇:GO語言規范
