Go標準庫database/sql,Rows.Scan NULL問題

使用Go標準庫database/sql,Rows.Scan如果遇到NULL,則會報錯,並且停止Scan後續的字段,導致獲得的數據不完整。

比如:

type TblUser struct {
   Id        int64
   LastIp     string
   NickName   string    
   Avatar     string    
   Lang       string    
}

假設LastIp爲NULL,其他字段都有數據,但是Rows.Scan的時候,只能識別出Id,其他字段都無法正確讀出。

而NULL在數據庫又很容易遇到,摸索了一段時間,找到一個方案,先上代碼:

m := new(TblUser)
dest := []interface{}{&(m.Id), &(m.LastIp), &(m.NickName), &(m.Avatar)}
newDest := make([]interface{}, 0, len(dest))
empty := sql.NullBool{}

queryValue := reflect.Indirect(reflect.ValueOf(query))
queryValue = queryValue.FieldByName("lastcols")
cnt := queryValue.Len()
for i := 0; i < cnt; i++ {
   v := queryValue.Index(i)
   v_ok := false
   if v.IsValid() {
      if v.InterfaceData()[0] != 0 {
         newDest = append(newDest, dest[i])
         v_ok = true
      }
   }
   if v_ok == false {
      newDest = append(newDest, &empty)
   }
}

_ = query.Scan(newDest...)

思路是:

  1. 通過反射,拿得從數據庫獲得的數據,即:lastcols

    lastcols是在結構體的非公開變量,所以需要反射

  2. 遍歷lastcols,獲取每項的interfaceData(),判斷是否有數據

  3. 如果沒有數據,則將scan結果放到一個sql.NullBool{}變量,該類型由引擎提供,可以接受NULL

  4. 最後就可以正常scan了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章