golang 使用 Gorm 查询数据库并在 http 响应中返回 json
golang querying database using Gorm and returning json in http response
我是 Go 的新手,我正在使用 Gorm 查询我的 postgres 数据库,但是我在 return 以字典格式处理我的数据时遇到了问题,其中 pokemon 的类型作为所有数组的键那种类型的神奇宝贝
json: cannot unmarshal object into Go value of type []models.Pokemon
这是我的代码:
type Pokemon struct {
Name string `db:"name"`
Type string `db:"type"`
}
pokemonTypes := [6]string{
"fire",
"electric",
"water",
"grass",
}
var retData struct {
Poke []Pokemon
}
m := make(map[string][]Pokemon)
for _, t := range pokemonTypes {
pokemon := DB.Where(&Pokemon{Type: t}).Find(&retData.Poke)
p, _ := json.Marshal(pokemon)
err = json.Unmarshal(p, &retData.Poke) // getting error here
if err != nil {
fmt.Println(err)
}
m[category] = retData.Poke
}
data, _ := json.Marshal(m)
w.Write(data) // http repsonse
我的数据库里有这个
name | type
----------------------
pikachu | electric
charmander | fire
blaziken | fire
venusaur | grass
treeko | grass
squirtle | water
我想return这种json格式的数据
{
“electric”: [
{"name": "pikachu", "type": "electric"},
],
"fire": [
{"name": "charmander", "type": "fire"},
{"name": "blaziken", "type": "fire"}
],
"grass": [
{"name": "venusaur", "type": "grass"},
{"name": "treeko", "type": "grass"},
],
"water": [
{"name": "squirtle", "type": "water"},
]
}
DB.Where(&Pokemon{Type: t}).Find(&retData.Poke)
本质上 return 返回 *db
指针,您可以使用它来链接更多方法。
当您执行 .Find(&retData.Poke)
时,您已经将 postgre 行反序列化到您的结构切片中。因此,pokemon
实际上并不是您所想的那样。
现在唯一剩下的就是用 .Error()
链接 .Find()
,这样您就可以 return 并检查查询中的任何错误。就像这样:
for _, t := range pokemonTypes {
err := DB.Where(&Pokemon{Type: t}).Find(&retData.Poke).Error()
if err != nil {
fmt.Println(err)
return
}
p, _ := json.Marshal(retData.Poke)
err = json.Unmarshal(p, &retData.Poke)
if err != nil {
fmt.Println(err)
return
}
m[category] = retData.Poke
}
希望对您有所帮助!
我是 Go 的新手,我正在使用 Gorm 查询我的 postgres 数据库,但是我在 return 以字典格式处理我的数据时遇到了问题,其中 pokemon 的类型作为所有数组的键那种类型的神奇宝贝
json: cannot unmarshal object into Go value of type []models.Pokemon
这是我的代码:
type Pokemon struct {
Name string `db:"name"`
Type string `db:"type"`
}
pokemonTypes := [6]string{
"fire",
"electric",
"water",
"grass",
}
var retData struct {
Poke []Pokemon
}
m := make(map[string][]Pokemon)
for _, t := range pokemonTypes {
pokemon := DB.Where(&Pokemon{Type: t}).Find(&retData.Poke)
p, _ := json.Marshal(pokemon)
err = json.Unmarshal(p, &retData.Poke) // getting error here
if err != nil {
fmt.Println(err)
}
m[category] = retData.Poke
}
data, _ := json.Marshal(m)
w.Write(data) // http repsonse
我的数据库里有这个
name | type
----------------------
pikachu | electric
charmander | fire
blaziken | fire
venusaur | grass
treeko | grass
squirtle | water
我想return这种json格式的数据
{
“electric”: [
{"name": "pikachu", "type": "electric"},
],
"fire": [
{"name": "charmander", "type": "fire"},
{"name": "blaziken", "type": "fire"}
],
"grass": [
{"name": "venusaur", "type": "grass"},
{"name": "treeko", "type": "grass"},
],
"water": [
{"name": "squirtle", "type": "water"},
]
}
DB.Where(&Pokemon{Type: t}).Find(&retData.Poke)
本质上 return 返回 *db
指针,您可以使用它来链接更多方法。
当您执行 .Find(&retData.Poke)
时,您已经将 postgre 行反序列化到您的结构切片中。因此,pokemon
实际上并不是您所想的那样。
现在唯一剩下的就是用 .Error()
链接 .Find()
,这样您就可以 return 并检查查询中的任何错误。就像这样:
for _, t := range pokemonTypes {
err := DB.Where(&Pokemon{Type: t}).Find(&retData.Poke).Error()
if err != nil {
fmt.Println(err)
return
}
p, _ := json.Marshal(retData.Poke)
err = json.Unmarshal(p, &retData.Poke)
if err != nil {
fmt.Println(err)
return
}
m[category] = retData.Poke
}
希望对您有所帮助!