這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
// Go語言針對MySQL資料查詢的錯誤處理方式package mainimport ( "database/sql" "fmt" "runtime")// go run test.gofunc 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 // 1、查詢一系列值 // 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) } // 2、查詢一條記錄 // 查詢一條記錄時, 不能使用類似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) // 3、關於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)}