我已經啟動了一個「instagram 克隆」後端來嘗試學習有關golang 的知識,但我遇到了一個不知道如何解決的問題。
我用 fiber 建立了一個簡單的 api,可以取得一些貼文:
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) }
問題是 likes
屬性作為字串傳回:
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": "[]", "user_id": "...", "created_at": "...", "updated_at": "..." } ]
我嘗試了一些東西,例如使用json.marshal(data)
,我還寫了like
結構,但我無法使其工作,因為當我將likes
的類型從string
更改為[]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
我正在使用 postgresql 資料庫,並且我第一次嘗試使用 jsonb
列,因此 likes
在資料庫中是 jsonb
列。
我理想的有效負載是這樣的:
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": [], "user_id": "...", "created_at": "...", "updated_at": "..." } ]
請注意,likes
現在是一個陣列而不是字串。那麼有人知道如何解決這個問題嗎?
您很可能需要實作sql.driver
的介面來「知道」如何掃描到您的結構,可能類似於
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) }
以上是為什麼 JSONB 以字串形式回傳?的詳細內容。更多資訊請關注PHP中文網其他相關文章!