Go語言結(jié)合gorm實現(xiàn)讀取PostgreSQL的json數(shù)據(jù)類型
常用方法
在本例中,數(shù)據(jù)庫有一個表 test_tbl1,包含如下三個字段:
- id,主鍵,長整型
- params,jsonb類型
- params2,json類型
接下來展示從該表中讀取一行數(shù)據(jù)的幾種方法:
方法一
type TestTbl1 struct {
ID int64 `gorm:"primaryKey"`
Params string
Params2 string
}
func main() {
row := &TestTbl1{}
var db *gorm.DB
db = initDB() // 初始化數(shù)據(jù)庫連接的代碼省略,可以查閱相關資料
err := db.First(row).Error
if err != nil {
log.Error("fail to query test_tbl1: %v", err)
}
log.Infof("get data: %+v", row)
log.Infof("get data: params: %+v", row.Params)
log.Infof("get data: params2: %+v", row.Params2)
}
這是比較簡單和適用性較強的方法,查出字符串之后再做解析。即使數(shù)據(jù)庫的json/jonb字段格式不一致時,也能正常運行。
方法二
考慮到go中做json解析的方法是json.Unmarshal,該方法的參數(shù)是[]byte,為了方便做json解析,可以直接將字段類型從sting改為[]byte:
type TestTbl1 struct {
ID int64 `gorm:"primaryKey"`
Params []byte
Params2 []byte
}
func main() {
row := &TestTbl1{}
var db *gorm.DB
db = initDB() // 初始化數(shù)據(jù)庫連接的代碼省略,可以查閱相關資料
err := db.First(row).Error
if err != nil {
log.Error("fail to query test_tbl1: %v", err)
}
log.Infof("get data: %+v", row)
log.Infof("get data: params: %+v", string(row.Params))
log.Infof("get data: params2: %+v", string(row.Params2))
}
方法三
如果json/jsonb字段的格式是固定的,可以在查詢的時候自動做json解析。在本例中,假設param的取值示例為 {"k1": "v1", "k2": "v2"},param2的取值示例為["v1","v2","v3"],則相關代碼如下:
type StringArray []string
func (j *StringArray) Scan(value interface{}) error {
return json.Unmarshal(value.([]byte), j)
}
func (j *StringArray) Value() (driver.Value, error) {
return json.Marshal(j)
}
type JsonObject struct {
K1 string
K2 string
}
func (j *JsonObject) Scan(value interface{}) error {
return json.Unmarshal(value.([]byte), j)
}
func (j *JsonObject) Value() (driver.Value, error) {
return json.Marshal(j)
}
type TestTbl1 struct {
ID int64 `gorm:"primaryKey"`
Params JsonObject `gorm:"type:jsonb"`
Params2 StringArray `gorm:"type:json"`
}
func main() {
row := &TestTbl1{}
var db *gorm.DB
db = initDB() // 初始化數(shù)據(jù)庫連接的代碼省略,可以查閱相關資料
err := db.First(row).Error
if err != nil {
log.Error("fail to query test_tbl1: %v", err)
}
log.Infof("get data: %+v", row)
log.Infof("get data: params: %+v", row.Params)
log.Infof("get data: params2: %+v", row.Params2)
}
這一種方法的普適性有限。例如,如果json/jsonb字段存儲的是第三方透傳參數(shù),則其格式就不是固定的,本方法則不適用。
到此這篇關于Go語言結(jié)合gorm實現(xiàn)讀取PostgreSQL的json數(shù)據(jù)類型的文章就介紹到這了,更多相關Go gorm讀取PostgreSQL數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
go select編譯期的優(yōu)化處理邏輯使用場景分析
select 是 Go 中的一個控制結(jié)構(gòu),類似于用于通信的 switch 語句。每個 case 必須是一個通信操作,要么是發(fā)送要么是接收。接下來通過本文給大家介紹go select編譯期的優(yōu)化處理邏輯使用場景分析,感興趣的朋友一起看看吧2021-06-06

