記錄一下實操過程中遇到的問題或者疑惑,也有一些是需要注意的點,既然花了時間解決就值得記錄下來
-
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 這樣的子結構體裏。
-