// 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) }