Rumah > Artikel > pembangunan bahagian belakang > Golang sqlx menukar sebelah kanan banyak kepada banyak bergabung kepada tatasusunan
editor php Xigua akan memperkenalkan kepada anda dalam artikel ini cara Golang sqlx menukar bahagian kanan sambungan banyak-ke-banyak kepada tatasusunan. Golang ialah bahasa pengaturcaraan yang berkuasa, dan sqlx ialah alat pangkalan data Golang yang popular. Apabila menggunakan sqlx untuk sambungan banyak-ke-banyak, kita selalunya perlu menukar hasil di sebelah kanan kepada tatasusunan untuk pemprosesan dan pengendalian yang lebih mudah. Artikel ini akan memperkenalkan secara terperinci cara menggunakan sqlx dan beberapa contoh untuk menunjukkan proses ini. Saya harap ia akan membantu semua orang.
Saya ada dua meja unit dan imej unit dengan kunci asing unit.
Saya melaksanakan pertanyaan sql ini
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;
Sebagai tindak balas saya mendapat semua medan unit dan menyertai medan unit_images seperti ini
{"(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 struktur bahasa
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"` }
kod 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)
Saya mendapat ralat "sql: 列索引 45 上的扫描错误,名称 "unit_images": 不支持扫描,将 driver.value 类型 []uint8 存储到类型 *[]*unitimages"
Saya baru mengenali golang dan saya ingin apa-apa petua untuk menyelesaikan masalah ini. Mungkin saya tersalah pilih jalan.
Saya ingin tahu cara yang betul untuk menyelesaikan masalah ini.
Nampaknya hasil sql yang dikembalikan ialah:
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)]
Jadi
`unitimages []unitimages `json:"unit_images" db:"unit_images"`
Itu idea yang betul, anda mempunyai tatasusunan unitimages. Tetapi:
id *int `json:"id" db:"id"` image *string `json:"image" db:"image"` ismain *bool `json:"is_main" db:"is_main"`
Sila ambil perhatian bahawa id
、image
、is_main
tidak mempunyai lajur sql, jadi go tidak boleh memetakannya.
Mudah betulkan tukar imej unit kepada []mana-mana dan kemudian hantar kandungan ke dalam tatasusunan itu sendiri seperti ini:
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.
Atas ialah kandungan terperinci Golang sqlx menukar sebelah kanan banyak kepada banyak bergabung kepada tatasusunan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!