Golang SQLX konvertiert die rechte Seite eines Viele-zu-Viele-Joins in ein Array

WBOY
Freigeben: 2024-02-14 14:48:09
nach vorne
530 Leute haben es durchsucht

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

php-Editor Xigua stellt Ihnen in diesem Artikel vor, wie Golang sqlx die rechte Seite einer Many-to-Many-Verbindung in ein Array umwandelt. Golang ist eine leistungsstarke Programmiersprache und SQLX ist ein beliebtes Golang-Datenbanktool. Wenn wir SQLX für Viele-zu-Viele-Verbindungen verwenden, müssen wir die Ergebnisse auf der rechten Seite häufig zur einfacheren Verarbeitung und Bedienung in ein Array konvertieren. In diesem Artikel wird die Verwendung von SQLX ausführlich vorgestellt und einige Beispiele zur Veranschaulichung dieses Prozesses vorgestellt. Ich hoffe, dass er für alle hilfreich ist.

Frageninhalt

Ich habe zwei Tabellen Unit und Unitimage mit Unit-Fremdschlüssel.

Ich führe diese SQL-Abfrage aus

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;
Nach dem Login kopieren

Als Antwort bekam ich alle Einheitenfelder und schloss mich dem Feld „unit_images“ wie folgt an

{"(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)"}
Nach dem Login kopieren

go-Sprachstruktur

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"`
}
Nach dem Login kopieren

SQLX-Code

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)
Nach dem Login kopieren

Ich habe einen Fehler erhalten "sql: 列索引 45 上的扫描错误,名称 "unit_images": 不支持扫描,将 driver.value 类型 []uint8 存储到类型 *[]*unitimages"

Ich bin neu bei Golang und hätte gerne Tipps zur Lösung dieses Problems. Vielleicht habe ich den falschen Weg gewählt.

Ich möchte wissen, wie man dieses Problem richtig löst.

Lösung

Das zurückgegebene SQL-Ergebnis scheint wie folgt zu lauten:

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)]
Nach dem Login kopieren

Also

`unitimages []unitimages `json:"unit_images" db:"unit_images"`
Nach dem Login kopieren

Das ist die richtige Idee, Sie haben ein Unitimages-Array. Aber:

id *int `json:"id" db:"id"`
    image  *string `json:"image" db:"image"`
    ismain *bool   `json:"is_main" db:"is_main"`
Nach dem Login kopieren

Bitte beachten Sie, dass idimageis_main keine SQL-Spalten hat und Go diese daher nicht zuordnen kann.

Einfache Korrektur: Ändern Sie „unitimages“ in „[]any“ und übertragen Sie den Inhalt dann selbst wie folgt in dieses Array:

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.
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonGolang SQLX konvertiert die rechte Seite eines Viele-zu-Viele-Joins in ein Array. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage