Bei der Arbeit mit relationalen Datenbanken wie PostgreSQL unter Verwendung von Golang müssen häufig aggregierte Werte abgerufen werden. In diesem Fall ist die Berechnung der Summe einer Spalte, beispielsweise der Gehaltsspalte, eine häufige Aufgabe.
Der bereitgestellte Code versucht, die Summe der Gehaltsspalte zu berechnen aus der Tabelle „Personen“, es tritt jedoch ein Fehler auf. Es verwendet die SELECT-Anweisung mit SUM(Gehalt), um das Ergebnis abzurufen, und bindet den Wert an die NewPerson-Struktur. Dieser Ansatz ist jedoch falsch, da NewPerson kein Gehaltsfeld hat und die Abfrage versucht, das Ergebnis direkt der Struktur zuzuordnen.
Um dieses Problem zu beheben, ein anderer Ansatz ist erforderlich. Golang bietet die Scan-Funktion, die es Entwicklern ermöglicht, die Ergebnisse einer Abfrage abzurufen und sie einer benutzerdefinierten Datenstruktur zuzuordnen. Hier ist eine überarbeitete Version des Codes, der Scan verwendet:
<code class="go">type NResult struct { Salary int64 // or int, depending on the data type } func GetSalarySum(c echo.Context) error { db, err := gorm.Open("postgres", "...") checkError(err) defer db.Close() query := "SELECT SUM(salary) FROM people" var result NResult if err := db.Table("people").Raw(query).Scan(&result).Error; err != nil { fmt.Println("error->", err) } return c.JSON(http.StatusOK, result) }</code>
In diesem Code definieren wir eine benutzerdefinierte Struktur NResult mit einem einzelnen Gehaltsfeld vom Typ int64 oder int, abhängig vom Datentyp der Gehaltsspalte . Wir verwenden die Raw-Methode, um die Abfrage SELECT SUM(salary) FROM people direkt auszuführen, und die Scan-Funktion, um das Ergebnis abzurufen und es der NResult-Struktur zuzuordnen.
Dieser überarbeitete Code ruft die Summe des Gehalts korrekt ab Spalte und gibt sie als JSON-Antwort zurück.
Das obige ist der detaillierte Inhalt vonWie berechnet man die Summe einer Spalte mithilfe von GORM und Scan in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!