Rumah >pembangunan bahagian belakang >Golang >Mengapa JSONB dikembalikan sebagai rentetan?
Saya dah mulakan backend "klon instagram" untuk mencuba dan belajar tentang golang, tetapi saya menghadapi masalah yang saya tidak tahu bagaimana untuk menyelesaikannya.
Saya membina api mudah menggunakan gentian untuk mendapatkan beberapa siaran:
package server import ( "fmt" "instagram/internal/psql" queries "instagram/internal/sql" "net/http" "github.com/gofiber/fiber/v2" ) type like struct { username string name string picture string } type post struct { id string `json:"id"` description string `json:"description"` media string `json:"media"` type string `json:"type"` likes string `json:"likes"` user_id string `json:"user_id"` created_at string `json:"created_at"` updated_at string `json:"updated_at"` } func listposts(c *fiber.ctx) error { rows, err := psql.db().query(queries.getallposts) if err != nil { c.sendstatus(400) return nil } defer rows.close() var data []post for rows.next() { var post post err := rows.scan(&post.id, &post.description, &post.media, &post.type, &post.created_at, &post.updated_at, &post.likes, &post.user_id) if err != nil { fmt.print(err) c.sendstatus(400) return nil } data = append(data, post) } return c.status(http.statusok).json(data) }
Masalahnya ialah atribut likes
dikembalikan sebagai rentetan:
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": "[]", "user_id": "...", "created_at": "...", "updated_at": "..." } ]
Saya mencuba beberapa perkara seperti menggunakan json.marshal(data)
dan saya juga menulis struktur like
tetapi saya tidak dapat membuatnya berfungsi kerana apabila saya meletakkan json.marshal(data)
,我还写了 like
结构,但我无法使其工作,因为当我将 likes
的类型从 string
更改为 []like
Mesej berikut muncul semasa memanggil imbasan apabila jenis ditukar daripada string
kepada []like
sql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.likesql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.like
Saya menggunakan pangkalan data postgresql dan saya cuba menggunakan lajur jsonb
buat kali pertama, jadi jsonb
列,因此 likes
在数据库中是 jsonb
dalam pangkalan data ia adalah lajur jsonb
.
Muatan ideal saya kelihatan seperti ini:
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": [], "user_id": "...", "created_at": "...", "updated_at": "..." } ]
Perhatikan bahawa likes
现在是一个数组而不是字符串。那么有人知道如何解决这个问题吗?
您很可能需要实现 sql.driver
kini merupakan tatasusunan dan bukannya rentetan. Jadi adakah sesiapa tahu bagaimana untuk menyelesaikan masalah ini?
sql.driver
untuk "tahu" cara mengimbas ke dalam struktur anda, mungkin sesuatu seperti 🎜
type Like struct { Username string Name string picture string } type Likes []Like func (l Likes) Value() (driver.Value, error) { return json.Marshal(l) } // Make the Likes implement the sql.Scanner interface. func (l *Likes) Scan(value interface{}) error { b, ok := value.([]byte) if !ok { return errors.New("type assertion to []byte failed") } return json.Unmarshal(b, &l) }
Atas ialah kandungan terperinci Mengapa JSONB dikembalikan sebagai rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!