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

Golang sqlx menukar sebelah kanan banyak kepada banyak bergabung kepada tatasusunan

WBOY
WBOYke hadapan
2024-02-14 14:48:09473semak imbas

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;

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.

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)]

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 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.

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam