Go語(yǔ)言結(jié)合gorm實(shí)現(xiàn)讀取PostgreSQL的json數(shù)據(jù)類型
常用方法
在本例中,數(shù)據(jù)庫(kù)有一個(gè)表 test_tbl1,包含如下三個(gè)字段:
- id,主鍵,長(zhǎng)整型
- 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ù)庫(kù)連接的代碼省略,可以查閱相關(guān)資料
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)
}
這是比較簡(jiǎn)單和適用性較強(qiáng)的方法,查出字符串之后再做解析。即使數(shù)據(jù)庫(kù)的json/jonb字段格式不一致時(shí),也能正常運(yùn)行。
方法二
考慮到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ù)庫(kù)連接的代碼省略,可以查閱相關(guān)資料
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字段的格式是固定的,可以在查詢的時(shí)候自動(dòng)做json解析。在本例中,假設(shè)param的取值示例為 {"k1": "v1", "k2": "v2"},param2的取值示例為["v1","v2","v3"],則相關(guān)代碼如下:
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ù)庫(kù)連接的代碼省略,可以查閱相關(guān)資料
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字段存儲(chǔ)的是第三方透?jìng)鲄?shù),則其格式就不是固定的,本方法則不適用。
到此這篇關(guān)于Go語(yǔ)言結(jié)合gorm實(shí)現(xiàn)讀取PostgreSQL的json數(shù)據(jù)類型的文章就介紹到這了,更多相關(guān)Go gorm讀取PostgreSQL數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang實(shí)現(xiàn)京東支付v2版本的示例代碼
這篇文章主要介紹了golang實(shí)現(xiàn)京東支付v2版本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
GO的基礎(chǔ)知識(shí)掃盲注意事項(xiàng)
這篇文章主要介紹了GO的基礎(chǔ)知識(shí)注意事項(xiàng),本文是GO語(yǔ)言小白的掃盲文,主要講解了go語(yǔ)言的基本知識(shí),GO程序目錄結(jié)構(gòu),GO程序包的導(dǎo)入與別名運(yùn)用,GO內(nèi)置關(guān)鍵字,GO注釋方法需要的朋友可以參考下2022-12-12
詳解如何使用Golang實(shí)現(xiàn)自定義規(guī)則引擎
規(guī)則引擎的功能可以簡(jiǎn)化為當(dāng)滿足一些條件時(shí)觸發(fā)一些操作,通常使用 DSL 自定義語(yǔ)法來表述,本文給大家介紹了如何使用Golang實(shí)現(xiàn)自定義規(guī)則引擎,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-05-05
Golang兩行代碼實(shí)現(xiàn)發(fā)送釘釘機(jī)器人消息
創(chuàng)建一個(gè)釘釘機(jī)器人必須使用加簽,本文通過Golang兩行代碼實(shí)現(xiàn)發(fā)送釘釘機(jī)器人消息,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2021-12-12
Golang的os標(biāo)準(zhǔn)庫(kù)中常用函數(shù)的整理介紹
這篇文章主要介紹了Go語(yǔ)言的os標(biāo)準(zhǔn)庫(kù)中常用函數(shù),主要用來實(shí)現(xiàn)與操作系統(tǒng)的交互功能,需要的朋友可以參考下2015-10-10
golang使用redis實(shí)現(xiàn)全文搜索功能詳解
這篇文章主要為大家詳細(xì)介紹了golang如何使用redis實(shí)現(xiàn)全文搜索功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
Go項(xiàng)目中添加生成時(shí)間與版本信息的方法
本文主要介紹了Go項(xiàng)目中添加生成時(shí)間與版本信息的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
golang如何設(shè)置Header Content-type
這篇文章主要介紹了golang如何設(shè)置Header Content-type問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
關(guān)于go-zero服務(wù)自動(dòng)收集問題分析
這篇文章主要介紹了關(guān)于go-zero服務(wù)自動(dòng)收集問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12

