關於go語言數據庫存儲和顯示null值的問題困擾了我很久,並且也和群友討論過這個問題,但是都沒有得到相對滿意和全面的答案。最近翻牆找了幾篇相對詳細和權威的文章,分享給大家,希望和大家一起進步,go go go!
文章一:Go語言:解決數據庫中null值的問題(轉載國人文章)
文章二:How I handled possible null values from database rows in Golang?(需科學上網)
文章三:Working effectively with database nulls(試驗過不需要科學上網)
Github:有沒有專門的null值函數庫?
https://github.com/guregu/null介紹
import "gopkg.in/guregu/null.v3"
null是一個具有合理選項的庫,用於處理可空的SQL和JSON值
有兩個包: null
及其子包zero
。
null
類型僅在null輸入時被視為null,並且JSON將編碼為null
。 如果您需要零並且null被視為單獨的值,請使用這些值。
zero
中的類型在Go中被視為零值:空字符串輸入將生成空零zero.String
,並且空字符串將JSON編碼為""
。 這些類型的零值將被視為對SQL無效。 如果你需要零和null處理相同,使用這些。
所有類型都實現了sql.Scanner
和driver.Valuer
,因此您可以使用此庫代替sql.NullXXX
。 所有類型還實現: encoding.TextMarshaler
, encoding.TextUnmarshaler
, json.Marshaler
和json.Unmarshaler
。
null包
import "gopkg.in/guregu/null.v3"
null.String
可以為空的字符串。
如果SQL源數據為空,則Marshals為JSON null。 零(空白)輸入不會產生空字符串。 可以從sql.NullString
JSON輸入或字符串輸入解sql.NullString
。
null.Int
可以為null的int64。
如果SQL源數據為空,則Marshals為JSON null。 零輸入不會產生null Int。 可以從sql.NullInt64
JSON輸入解sql.NullInt64
。
null.Float
可空浮動64。
如果SQL源數據為空,則Marshals為JSON null。 零輸入不會產生null Float。 可以從sql.NullFloat64
JSON輸入解sql.NullFloat64
。
null.Bool
可空的布爾。
如果SQL源數據為空,則Marshals為JSON null。 虛假輸入不會產生null Bool。 可以從sql.NullBool
JSON輸入解sql.NullBool
。
null.Time
如果SQL源數據為空,則Marshals為JSON null。 使用time.Time
的封送者。 可以從pq.NullTime
和類似的JSON輸入解pq.NullTime
。
零包裝
import "gopkg.in/guregu/null.v3/zero"
zero.String
可以為空的字符串。
如果為null,將Marshal編排為空字符串。 空字符串輸入生成空字符串。 空值和零值被認為是等價的。 可以從sql.NullString
JSON輸入解sql.NullString
。
zero.Int
可以為null的int64。
如果為null,將Marshal編排為0。 0產生一個空Int。 空值和零值被認為是等價的。 可以從sql.NullInt64
JSON輸入解sql.NullInt64
。
zero.Float
可空浮動64。
如果為null,將Marshal編排為0。 0.0產生一個null Float。 空值和零值被認為是等價的。 可以從sql.NullFloat64
JSON輸入解sql.NullFloat64
。
zero.Bool
可空的布爾。
如果為null,將Marshal編排為false。 false
產生一個null Float。 空值和零值被認為是等價的。 可以從sql.NullBool
JSON輸入解sql.NullBool
。
zero.Time
如果為null,將Marshal編排為零時間。 使用time.Time
的封送者。 可以從pq.NullTime
和類似的JSON輸入解pq.NullTime
。
錯誤
json
的",omitempty"
結構標記現在無法正常工作。 它永遠不會省略null或空String。 這可能最終會得到解決 。