Rumah > pembangunan bahagian belakang > Golang > Golang sqlx menukar sebelah kanan banyak kepada banyak bergabung kepada tatasusunan

Golang sqlx menukar sebelah kanan banyak kepada banyak bergabung kepada tatasusunan

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2024-02-14 14:48:09
ke hadapan
584 orang telah melayarinya

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

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.

Isi soalan

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

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

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

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

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.

Penyelesaian

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

Jadi

`unitimages []unitimages `json:"unit_images" db:"unit_images"`
Salin selepas log masuk

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

Sila ambil perhatian bahawa idimageis_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.
Salin selepas log masuk

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!

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