<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      GO語言程序查詢數據庫字段為空遇到的幾個問題總結

      如果字段值可能為空,那么從表里面讀取數據的時候程序使用的變量類型應該使用 sql.NullXXX 類型,比如下面的日期類型:

      var id uint
      var createAt time.Time
      var updateAt time.Time
      var deleteAt sql.NullTime
      var name string
      var gartenId uint
      var beginAt time.Time
      var endAt time.Time
      var monthBegin int
      var monthEnd int
      var child []byte
      var content []byte
      var creator uint

       開始的時候,deleteAt 使用的也是 time.Time類型。

      err = rows.Scan(&id,
      			&createAt,
      			&updateAt,
      			&deleteAt,
      			&name,
      			&gartenId,
      			&beginAt,
      			&endAt,
      			&monthBegin,
      			&monthEnd,
      			&child,
      			&content,
      			&creator)
      

       這里讀取數據都沒有問題,但是發現當數據庫日期類型字段為NULL的時候,日期類型變量讀取到的是0000年的默認日期值,如果稍后再用這個默認值插入數據庫,會出現下面的錯誤:

      incorrect datetime value: ‘0000-00-00‘ for column ‘start‘ at row 1

      要解決這個問題的辦法,就不能使用日期類型變量的默認值插入數據庫,可以定義一個引用類型的變量,比如下面的代碼,在上面Scan之后將讀取出來的變量值賦值給一個結構對象。當然前提得定義變量為sql.NullXXX類型,比如下面代碼中的 deleteAt變量:

      var recipe entity.RecipeDO
      
      recipe.ID = &id
      recipe.CreateAt = &createAt
      recipe.UpdateAt = &updateAt
      if deleteAt.Valid {
      	recipe.DeleteAt = &deleteAt.Time
      }
      recipe.Name = &name
      

       這樣如果數據庫字段值為空的話,deleteAt.Valid為假,那么 recipe.DeleteAt 字段就是空了(nil),下面看下 RecipeDO 結構體的定義:

      type RecipeDO struct {
      	ID         *uint             
      	CreateAt   *time.Time       
      	UpdateAt   *time.Time        
      	DeleteAt   *time.Time        
      	Name       *string           
      	GartenID   *uint             
      	BeginAt    *time.Time        
      	EndAt      *time.Time         
      	MonthBegin *int               
      	MonthEnd   *int              
      	ChildList  *[]*ChildForRecipe 
      	Content    *[]*DailyMenu     
      	Creator    *uint              
      }
      

       以后插入數據的時候,判斷下結構體字段 DeleteAt是否為空,寫不同的插入代碼即可,如下示例:

              if do.DeleteAt != nil {
      		_, err = stmt.Exec(*do.UpdateAt, *do.DeleteAt, *do.Name, *do.GartenID, *do.BeginAt, *do.EndAt, *do.MonthBegin, *do.MonthEnd, jsChildList, jsContent, *do.ID)
      	}else{
      		_, err = stmt.Exec(*do.UpdateAt, nil, *do.Name, *do.GartenID, *do.BeginAt, *do.EndAt, *do.MonthBegin, *do.MonthEnd, jsChildList, jsContent, *do.ID)
      	}
      

       當然也可以在上面的代碼中Exec方法的第二個參數定義一個 sql.NullTime類型,就不用寫上面的分支代碼了。

      PS:

      GO語言程序查詢數據處理空值的方式還是比較簡陋的,容易掉坑里面去。要避免這個問題,最簡單的辦法還是在建表的時候,給所有字段都設置默認值。當然有時候字段值為NULL有特殊業務含義的話,上面的解決過程是繞不開了。

      彩蛋:

      上面示例中 RecipeDO 結構體的Content字段是一個復雜結構,數據庫對應的表的Content字段是一個json類型,這個字段插入數據庫之前必須先Json序列化,補上序列化它們的代碼:

              jsContent,err1 :=json.Marshal(*do.Content)
      	if err1 != nil {
      		logger.Errorf("Recipe update Content to JSON ", query, err1.Error())
      		return  err1
      	}
      

       同樣,從數據庫讀取這個字段,也要反序列化處理一下:

      		err = rows.Scan(&id,
      			&createAt,
      			&updateAt,
      			&deleteAt,
      			&name,
      			&gartenId,
      			&beginAt,
      			&endAt,
      			&monthBegin,
      			&monthEnd,
      			&child,
      			&content,
      			&creator)
      //其余代碼略
      var recipe entity.RecipeDO
      //其余代碼略
      
      //反序列化content字段讀取的值
      var contentObj = make([]*entity.DailyMenu, 0)
      		err = json.Unmarshal(content, &contentObj)
      		if err != nil {
      			logger.Errorf(" GetDO parse content error, ", query, err.Error())
      			return nil, err
      		}
      		recipe.Content = &contentObj
      

       

      參考鏈接:

      go mysql null_Go 查詢數據庫 Scan Null 字段報錯解決辦法

      https://blog.csdn.net/weixin_30940057/article/details/113566387?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242

      go語言scan空值報錯

      https://blog.csdn.net/leonpengweicn/article/details/51192557

      解決Go語言數據庫中null值的問題

      https://www.jb51.net/article/202690.htm

       

      posted on 2021-10-13 12:38  深藍醫生  閱讀(1333)  評論(1)    收藏  舉報

      導航

      主站蜘蛛池模板: 69天堂人成无码免费视频 | 波多野结衣一区二区三区高清av| 国产自拍一区二区三区在线| 少妇办公室好紧好爽再浪一点| 玩弄放荡人妻少妇系列 | 日本一区二区三区在线看| 亚洲成a人片在线观看中文| 中文字幕一区二区久久综合| 亚洲日韩久热中文字幕| 日本欧美大码a在线观看| 亚洲欧洲精品成人久久曰| 亚洲中文久久久精品无码| 好男人社区在线www| 国产99青青成人A在线| 国产普通话对白刺激| 国内精品亚洲成av人片| 亚洲Av综合日韩精品久久久| 久久精品国产91久久麻豆| 久久九九精品99国产精品| 亚洲最大av一区二区| 亚洲第一福利网站在线| 精品乱码一区二区三四五区| 国产激情一区二区三区在线| 五月婷婷久久中文字幕| 国产精品自偷一区在线观看| 成在人线AV无码免观看| 四川丰满少妇无套内谢| 东京热一区二区三区在线| 亚洲成aⅴ人片久青草影院| 日韩精品亚洲国产成人av| 天天做天天爱夜夜爽导航| 韩国午夜福利片在线观看| 国产精品三级中文字幕| 天美麻花果冻视频大全英文版| 亚洲精品电影院| 国产二区三区不卡免费| 东京热加勒比无码少妇| 男女动态无遮挡动态图| 亚洲av永久无码精品水牛影视| 97色成人综合网站| 久久久久久久久18禁秘|