gin框架和xorm踩坑記錄

記錄一下實操過程中遇到的問題或者疑惑,也有一些是需要注意的點,既然花了時間解決就值得記錄下來

 

  • required認爲值爲0不通過校驗

    • 背景:
      gin框架中一般用通過定義結構體中的字段Tag標籤來設置參數校驗規則和解析字段名,轉json相關信息,其中字段是否爲必須項規則寫在字段Tag:`binding:"required"`
    • 場景描述:
      我定義了一個VO結構體用來綁定前端參數,其中有個字段Status int `binding:"required, eq=0|eq=1"`,我希望綁定的時候驗證Status不爲空,且值爲0或1
      但是實際上Status爲1的時候通過校驗,爲0的時候卻返回了error:Error:Field validation for 'Status' failed on the 'required' tag即Status字段綁定時不滿足required校驗
      實際處理過程沒這麼清晰,但最後查到了文檔`binding:"required"`會認爲0是空值而不通過校驗
    • 解決方案:
      把整數字段改成整數指針類型,指針沒有默認值0,也就沒有這個問題了,注意取值加*,設值加&總之記得他是指針就好了
    • 結論:
      對數字類型的字段使用gin的校驗時,一定注意0值的處理,想象一下某個必填字段,測試的時候隨便測了幾個值沒發現任何問題,上線後一旦該字段爲0就會報錯

 

  • xorm不指定列通過Update傳入對象判斷不爲空的更新會忽略0值

    • 背景:
      可以用xorm的Update()傳入結構體對象,xorm會用你傳入的結構體對象中不爲空值的字段更新數據庫
    • 場景:
      還是上邊的場景,Status字段值爲0/1,如果用這個方法更新Status爲0永遠存不進去,因爲int的0會被當成空值
      對於這種情況一定要指定要用.Cols(數據庫字段名).Update(model對象)指定更新的列,即使是0值也會更新
    • 總結:
      表中有可能爲0的數字類型字段更新時,如果用Update方法要指定更新的列

 

  • xorm自動管理創建時間,更新時間(標籤),即使指定列更新也會更新時間

    • 背景:
      很多表需要創建時間和更新時間兩個字段,xorm可以識別model字段`created`和`updated`標籤幫我們自動管理這兩個字段,即插入和更新自動填寫/更新
    • 場景:
      還是上例的指定更新列,那麼問題來了,我沒有指定創建時間和更新時間,更新的時候xorm會更新對應時間嗎
      答案是會的,即使指定要更新的列裏沒有,也會自動更新
    • 結論:
      指定列更新時不需要指定標示`created`和`updated`的時間字段,沒想到什麼場景會導致問題,既然是更新時間那麼任何的更新都應該刷新時間

 

  • 注意:

    • Bind/ShouldBind會根據請求頭裏Content-Type類型解析,如果是json格式一定要加application/json,或者直接用BindJSON/ShouldBindJSON

    • 在   struct 加上該註釋並沒有用,必須使用   dive 標記,它告訴 required 校驗 深入到  slice、array 這樣的子結構體裏。

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