Maison > Article > développement back-end > Golang sqlx convertit le côté droit de plusieurs en plusieurs jointures au tableau
l'éditeur php Xigua vous présentera dans cet article comment Golang sqlx convertit le côté droit d'une connexion plusieurs-à-plusieurs en un tableau. Golang est un langage de programmation puissant et sqlx est un outil de base de données Golang populaire. Lorsque nous utilisons sqlx pour des connexions plusieurs-à-plusieurs, nous devons souvent convertir les résultats du côté droit en un tableau pour un traitement et un fonctionnement plus faciles. Cet article présentera en détail comment utiliser sqlx et quelques exemples pour démontrer ce processus. J'espère qu'il sera utile à tout le monde.
J'ai deux tables unit et unitimage avec clé étrangère d'unité.
J'exécute cette requête 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;
En réponse, j'ai obtenu tous les champs unitaires et j'ai rejoint le champ unit_images comme ceci
{"(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)"}
aller à la structure linguistique
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"` }
code 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)
J'ai eu une erreur "sql: 列索引 45 上的扫描错误,名称 "unit_images": 不支持扫描,将 driver.value 类型 []uint8 存储到类型 *[]*unitimages"
Je suis nouveau sur Golang et j'aimerais avoir des conseils sur la façon de résoudre ce problème. Peut-être que j'ai mal choisi.
Je veux connaître la bonne façon de résoudre ce problème.
Il semble que le résultat SQL renvoyé soit :
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)]
Alors
`unitimages []unitimages `json:"unit_images" db:"unit_images"`
C'est la bonne idée, vous avez un tableau unitimages. Mais :
id *int `json:"id" db:"id"` image *string `json:"image" db:"image"` ismain *bool `json:"is_main" db:"is_main"`
Veuillez noter que id
、image
、is_main
n'a pas de colonnes SQL, donc Go ne peut pas les mapper.
Correction facile, changez les images unitaires en [] any, puis transmettez vous-même le contenu dans ce tableau comme ceci :
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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!