Heim > Artikel > Backend-Entwicklung > Golang SQLX konvertiert die rechte Seite eines Viele-zu-Viele-Joins in ein Array
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.
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;
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)"}
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"` }
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)
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.
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)]
Also
`unitimages []unitimages `json:"unit_images" db:"unit_images"`
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"`
Bitte beachten Sie, dass id
、image
、is_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.
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!