Go語言針對MySQL數據查詢的錯誤處理方式

// Go語言針對MySQL數據查詢的錯誤處理方式
package main

import (
    "database/sql"
    "fmt"
    "runtime"
)

// go run test.go
func main() {
    // mysql擴展 https://github.com/go-sql-driver/mysql
    db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8")
    if err != nil {
        fmt.Println(err)
    }
    // db鏈接通常不主動關閉, 除非確認確實再也不須要該鏈接了, go會進行回收
    defer db.Close()
    
    // 用戶模型, 表結構, 須要一個結構來接收查詢結果集
    type User struct {
        Id int32
        Name string
        Age int8
    }
    
    // 保存用戶信息列表
    var user User
    
    // 一、查詢一系列值
    // Query結果集須要調用Next()方法進行逐條遍歷
    rows, err := db.Query(`
        SELECT id,name,age FROM user
    `)
    if err != nil {
        fmt.Println(err)
    }
    defer rows.Close()
    for rows.Next() {
        // 對於遍歷, 只須要判斷每次是否有錯誤產生便可
        // 參數綁定須要數量和位置一一對應
        if err := rows.Scan(&user.Id, &user.Name, &user.Age); err != nil {
            fmt.Println(err)
            continue
        }
        fmt.Println(user.Id, user.Name, user.Age)
    }
    // 處理完畢後, 須要在判斷一次遍歷過程當中是否有錯誤產生
    if err := rows.Err(); err != nil {
        fmt.Println(err)
    }
    
    // 二、查詢一條記錄
    // 查詢一條記錄時, 不能使用相似if err := db.QueryRow().Scan(&...); err != nil {}的處理方式
    // 由於查詢單條數據時, 可能返回var ErrNoRows = errors.New("sql: no rows in result set")該種錯誤信息
    // 而這屬於正常錯誤
    err = db.QueryRow(`
        SELECT id,name,age WHERE id = ?
    `, 2).Scan(
        &user.Id, &user.Name, &user.Age,
    )
    switch {
    case err == sql.ErrNoRows:
    case err != nil:
        // 使用該方式能夠打印出運行時的錯誤信息, 該種錯誤是編譯時沒法肯定的
        if _, file, line, ok := runtime.Caller(0); ok {
            fmt.Println(err, file, line)
        }
    }
    fmt.Println(user.Id, user.Name, user.Age)
    
    // 三、關於NULL
    // 全部查詢出來的字段都不容許有NULL, 避免該方式最好的辦法就是建表字段時, 不要設置相似DEFAULT NULL屬性
    // 還有一些沒法避免的狀況, 好比下面這個查詢
    // 該種查詢, 若是不存在, 返回值爲NULL, 而非0, 針對該種簡單的查詢, 直接使用HAVING子句便可
    // 具體的查詢, 須要在編碼的過程當中自行處理
    var age int32
    err = db.QueryRow(`
        SELECT
            SUM(age) age
        FROM user
        WHERE id = ?
        HAVING age <> NULL
    `, 10).Scan(&age)
    switch {
    case err == sql.ErrNoRows:
    case err != nil:
        fmt.Println(err)
    }
    fmt.Println(age)
}
相關文章
相關標籤/搜索