Mengapa JSONB dikembalikan sebagai rentetan?

WBOY
Lepaskan: 2024-02-05 23:18:09
ke hadapan
655 orang telah melayarinya

为什么 JSONB 以字符串形式返回?

Isi soalan

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)
}
Salin selepas log masuk

Masalahnya ialah atribut likes dikembalikan sebagai rentetan:

[
    {
        "id": "...",
        "description": "...",
        "media": "...",
        "type": "...",
        "likes": "[]",
        "user_id": "...",
        "created_at": "...",
        "updated_at": "..."
    }
]
Salin selepas log masuk

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
Salin selepas log masuk

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": "..."
    }
]
Salin selepas log masuk

Perhatikan bahawa likes 现在是一个数组而不是字符串。那么有人知道如何解决这个问题吗?


正确答案


您很可能需要实现 sql.driver kini merupakan tatasusunan dan bukannya rentetan. Jadi adakah sesiapa tahu bagaimana untuk menyelesaikan masalah ini?

🎜

Jawapan betul

🎜🎜Anda berkemungkinan besar perlu melaksanakan antara muka 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)
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa JSONB dikembalikan sebagai rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!