Maison  >  Article  >  développement back-end  >  Golang sqlx convertit le côté droit de plusieurs en plusieurs jointures au tableau

Golang sqlx convertit le côté droit de plusieurs en plusieurs jointures au tableau

WBOY
WBOYavant
2024-02-14 14:48:09523parcourir

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

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.

Contenu de la question

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.

Solution

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 idimageis_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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer