Ich habe ein „Instagram-Klon“-Backend gestartet, um etwas über Golang zu lernen, bin aber auf ein Problem gestoßen, das ich nicht lösen kann.
Ich habe eine einfache API mit Glasfaser erstellt, um einige Beiträge zu erhalten:
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) }
Das Problem besteht darin, dass das Attribut likes
als Zeichenfolge zurückgegeben wird:
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": "[]", "user_id": "...", "created_at": "...", "updated_at": "..." } ]
Ich habe einige Dinge wie die Verwendung von json.marshal(data)
ausprobiert und auch eine ähnliche
-Struktur geschrieben, aber ich konnte es nicht zum Laufen bringen, weil beim Eingeben json.marshal(data)
,我还写了 like
结构,但我无法使其工作,因为当我将 likes
的类型从 string
更改为 []like
die folgende Meldung angezeigt wird beim Aufruf von scan, wenn der Typ von string
in []like
geändert wird
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
Ich verwende eine Postgresql-Datenbank und versuche zum ersten Mal, die Spalte jsonb
zu verwenden, also jsonb
列,因此 likes
在数据库中是 jsonb
in der Datenbank ist es die Spalte jsonb
.
Meine ideale Nutzlast sieht so aus:
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": [], "user_id": "...", "created_at": "...", "updated_at": "..." } ]
Beachten Sie, dass likes
现在是一个数组而不是字符串。那么有人知道如何解决这个问题吗?
您很可能需要实现 sql.driver
jetzt ein Array und kein String ist. Weiß jemand, wie man dieses Problem löst?
sql.driver
implementieren, um zu „wissen“, wie Sie in Ihre Struktur scannen so etwas wie 🎜
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) }
Das obige ist der detaillierte Inhalt vonWarum wird JSONB als String zurückgegeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!