第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在 golang 應(yīng)用程序中創(chuàng)建具有多個(gè) JSON 參數(shù)的 SQL 查詢?

如何在 golang 應(yīng)用程序中創(chuàng)建具有多個(gè) JSON 參數(shù)的 SQL 查詢?

Go
慕的地8271018 2022-04-26 10:47:07
正如您在我的Golang應(yīng)用程序中看到的那樣,我有一個(gè)名為layers.type Details struct {    Total int `json:"total"`    Gender string `json:"gender"`}type Layer struct {    ID int `json:"id"`    City string `json:"city"`    Details []Details `json:"details"`}layers := []Layer{    {        ID: 107509018555,        City: "London",        Details: []Details{            {                Total: 158,                Gender: "Male",            },            {                Total: 689,                Gender: "Female",            },        },    },    {        ID: 108509018556,        City: "New York",        Details: []Details{            {                Total: 756,                Gender: "Male",            },            {                Total: 356,                Gender: "Female",            },        },    },}我想將該數(shù)組的數(shù)據(jù)插入到PostgreSQL數(shù)據(jù)庫(kù)的表中。我的問(wèn)題是如何在應(yīng)用程序中創(chuàng)建這樣的 SQL 查詢?查詢:INSERT INTO layers (ID, CITY, DETAILS) VALUES(107509018555, 'London', '[{"total":158,"gender":"Male"},{"total":689,"gender":"Female"}]'::json),(108509018556, 'New York', '[{"total":756,"gender":"Male"},{"total":356,"gender":"Female"}]':json);
查看完整描述

1 回答

?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊

因?yàn)槲覠o(wú)法發(fā)表評(píng)論,所以我假設(shè):

  1. 您正在使用 golang 的database/sql或類似的包。

  2. 在您的數(shù)據(jù)庫(kù)中,details列具有類型JSONB

一種簡(jiǎn)單的方法是循環(huán)切片layers并為此構(gòu)建查詢字符串:

"INSERT INTO layers (id,city,details) VALUES ($1,$2,$3), ($4,$5,$6)"

對(duì)于idcity,您可以輕松傳遞參數(shù),但是您需要為 傳遞 JSON 字節(jié)details。這意味著,您需要將詳細(xì)信息結(jié)構(gòu)編組為 JSON 字節(jié)以進(jìn)行插入/更新,并在 SELECT 時(shí)將“詳細(xì)信息”結(jié)果解組為結(jié)構(gòu)

您將需要:

  1. 定義封裝切片的新結(jié)構(gòu)Detail(我們稱之為Details)然后Details應(yīng)該實(shí)現(xiàn)這些接口。

  2. 實(shí)現(xiàn)driver.Valuer接口轉(zhuǎn)換Details為數(shù)據(jù)庫(kù)可以理解的JSON字節(jié)切片

  3. 實(shí)現(xiàn)sql.Scanner接口以將 JSON 字節(jié)切片從數(shù)據(jù)庫(kù)解組到您的結(jié)構(gòu)

代碼應(yīng)如下所示:

type Detail struct {

    Total  int    `json:"total"`

    Gender string `json:"gender"`

}


// this will implement driver.Valuer and sql.Scanner

type Details []Detail


// so that the database can understand your value, useful for INSERT/UPDATE

func (d Details) Value() (driver.Value, error) {

    return json.Marshal(d)

}


// so that the database can convert db value to your struct, useful for SELECT

func (d *Details) Scan(value interface{}) error {

    b, ok := value.([]byte)

    if !ok {

        return errors.New("type assertion to []byte failed for scanning Details")

    }


    return json.Unmarshal(b, &d)

}

完整代碼:


package main


import (

    "database/sql"

    "database/sql/driver"

    "encoding/json"

    "errors"

    "fmt"

    "log"

    "strings"


    _ "github.com/lib/pq"

)


type Layer struct {

    ID      int     `json:"id"`

    City    string  `json:"city"`

    Details Details `json:"details"`

}


// this will implement driver.Valuer and sql.Scanner

type Details []Detail


// so that the database can understand your value, useful for INSERT/UPDATE

func (d Details) Value() (driver.Value, error) {

    return json.Marshal(d)

}


// so that the database can convert db value to your struct, useful for SELECT

func (d *Details) Scan(value interface{}) error {

    b, ok := value.([]byte)

    if !ok {

        return errors.New("type assertion to []byte failed for scanning Details")

    }


    return json.Unmarshal(b, &d)

}


type Detail struct {

    Total  int    `json:"total"`

    Gender string `json:"gender"`

}


func main() {

    db, err := sql.Open("postgres", "postgres://user:pass@host:port/db?sslmode=disable")

    exitIfError(err)


    query, params := prepareQuery([]Layer{

        {

            ID:      107509018555,

            City:    "London",

            Details: []Detail{{Total: 158, Gender: "Male"}, {Total: 689, Gender: "Female"}},

        },

        {

            ID:      108509018556,

            City:    "New York",

            Details: []Detail{{Total: 756, Gender: "Male"}, {Total: 356, Gender: "Female"}},

        },

    })


    log.Println(query) 

    // INSERT INTO layers (id, city, details) VALUES ($1, $2, $3),($4, $5, $6)

    log.Println(params) 

    // [107509018555 London [{158 Male} {689 Female}] 108509018556 New York [{756 Male} {356 Female}]]


    result, err := db.Exec(query, params...)

    exitIfError(err)



    rows, _ := result.RowsAffected()

    log.Println(rows) // 2 rows inserted

}


func exitIfError(err error) {

    if err != nil {

        log.Fatal(err)

    }

}


func prepareQuery(layers []Layer) (string, []interface{}) {

    query := "INSERT INTO layers (id, city, details) VALUES "

    params := []interface{}{}

    x := 1


    for _, layer := range layers {

        query += fmt.Sprintf("($%d, $%d, $%d),", x, x+1, x+2)

        params = append(params, layer.ID, layer.City, layer.Details)

        x += 3

    }


    query = strings.TrimSuffix(query, ",")

    return query, params

}



查看完整回答
反對(duì) 回復(fù) 2022-04-26
  • 1 回答
  • 0 關(guān)注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)