Golang sqlx 將多對多連線的右側轉換為陣列

WBOY
發布: 2024-02-14 14:48:09
轉載
425 人瀏覽過

Golang sqlx 将多对多连接的右侧转换为数组

php小編西瓜在這篇文章中將為大家介紹Golang sqlx如何將多對多連接的右側轉換為陣列。 Golang是一種強大的程式語言,而sqlx是一個流行的Golang資料庫工具。在使用sqlx進行多對多連接時,我們經常需要將右側的結果轉換為數組,以便更方便地進行處理和操作。本文將詳細介紹如何使用sqlx和一些實例來示範這個過程,希望能對大家有幫助。

問題內容

我有兩張桌子 具有 unit 外鍵的 unit 和 unitimage。

我執行這個sql查詢

select un.*, array_agg(row(ui.is_main, ui.image, ui.id)) as unit_images from unit un inner join unitimage ui on ui.unit_id = un.id group by un.id;
登入後複製

作為回應,我得到了所有單位字段並像這樣加入了字段unit_images

{"(f,photos/units/unit_37/90_big.jpg,108)","(f,photos/units/unit_37/91_big.jpg,109)","(f,photos/units/unit_37/92_big.jpg,110)","(f,photos/units/unit_37/93_big.jpg,111)"}
登入後複製

go 語言結構體

type unit struct { id *int `json:"id" db:"id"` name *string `json:"name" db:"name"` ... a lot of fields unitimages []unitimages `json:"unit_images" db:"unit_images"` } type unitimages struct { id *int `json:"id" db:"id"` image *string `json:"image" db:"image"` ismain *bool `json:"is_main" db:"is_main"` }
登入後複製

sqlx程式碼

query := fmt.Sprintf("SELECT un.*, array_agg(ROW(ui.id, ui.image, ui.is_main)) as unit_images FROM %s un INNER JOIN %s ui ON ui.unit_id = un.id GROUP BY un.id", unitsTable, unitImagesTable) err := r.db.Select(&units, query)
登入後複製

我收到錯誤"sql: 列索引45 上的掃描錯誤,名稱\"unit_images\": 不支援掃描,將driver.value 類型[]uint8 儲存到類型*[]*unitimages"

我是 golang 的新手,我想獲得有關如何解決此問題的任何提示。也許我選擇了錯誤的方式。

我想知道解決此問題的正確方法。

解決方法

看起來回傳的 sql 結果是:

un.id | un.name | un.description | unit_images ------+---------+----------------+--------------------------------------------------------------------- 1 | unit a | description a | [(true, 'image1.jpg', 1), (false, 'image2.jpg', 2), (false, 'image3.jpg', 3)] 2 | unit b | description b | [(true, 'image4.jpg', 4), (true, 'image5.jpg', 5), (false, 'image6.jpg', 6)] 3 | unit c | description c | [(true, 'image7.jpg', 7), (false, 'image8.jpg', 8), (false, 'image9.jpg', 9)]
登入後複製

所以

`unitimages []unitimages `json:"unit_images" db:"unit_images"`
登入後複製

這是正確的想法,您有一個 unitimages 陣列。但是:

id *int `json:"id" db:"id"` image *string `json:"image" db:"image"` ismain *bool `json:"is_main" db:"is_main"`
登入後複製

請注意,idimageis_main沒有 sql 列,因此 go 無法對應它們。

輕鬆修復將 unitimages 更改為 []any,然後自己將內容投射到該數組中,如下所示:

for _, item := range thing.UnitImages { isMain := item[0].(bool) image := item[1].(string) id := item[2].(int64) //TODO do something with these vars } Or you could use `pg.StringArray` type.
登入後複製

以上是Golang sqlx 將多對多連線的右側轉換為陣列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!