Heim  >  Artikel  >  Backend-Entwicklung  >  Golang SQLX konvertiert die rechte Seite eines Viele-zu-Viele-Joins in ein Array

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

WBOY
WBOYnach vorne
2024-02-14 14:48:09525Durchsuche

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;

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.

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

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen