如何将行的AVG放入新列?

时间:2018-09-30 17:30:37

标签: postgresql go

大家好,我正在使用golang构建超简单的API。我有这个JSON数据从POST请求传递并存储在我的数据库中。我想将tts数据作为一个整数数组并将其平均,然后将其放在ttc列中,然后在json响应上返回该数字。我很难做任何帮助,将不胜感激。下面是我的源代码以及我的数据库模型。我知道我必须以某种方式在postgres中使用AVG()函数,但是我是Postgres的新手,所以我非常困惑。

main.go

package main

import (
"encoding/json"
"github.com/gorilla/mux"
"github.com/jinzhu/gorm"
"github.com/lib/pq"
"github.com/rs/cors"
"log"
"net/http"

_ "github.com/jinzhu/gorm/dialects/postgres"
)

type Resource struct {
    gorm.Model

    Name        string
    TTS     pq.Int64Array `gorm:"type:integer[]"`
    TTC int
}

var db *gorm.DB
var err error

func main() {
    router := mux.NewRouter()

    db, err = gorm.Open(
        "postgres",
        "host=localhost"+" user=postgres"+
        " dbname=Shoes"+" sslmode=disable password=root")

    if err != nil {
        panic("failed to connect database")
    }

    defer db.Close()

    db.AutoMigrate(&Resource{})

    router.HandleFunc("/resources", GetResources).Methods("GET")
    router.HandleFunc("/resources/{id}", GetResource).Methods("GET")
    router.HandleFunc("/resources", CreateResource).Methods("POST")
    router.HandleFunc("/resources/{id}", DeleteResource).Methods("DELETE")

    handler := cors.Default().Handler(router)

    log.Fatal(http.ListenAndServe(":8080", handler))
}

func GetResources(w http.ResponseWriter, r *http.Request) {
    var resources []Resource
    db.Find(&resources)
    json.NewEncoder(w).Encode(&resources)
}

func GetResource(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    var resource Resource
    db.First(&resource, params["id"])
    json.NewEncoder(w).Encode(&resource)
}

func CreateResource(w http.ResponseWriter, r *http.Request) {
    var resource Resource
    json.NewDecoder(r.Body).Decode(&resource)
    db.Create(&resource)
    json.NewEncoder(w).Encode(&resource)
}

func DeleteResource(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    var resource Resource
    db.First(&resource, params["id"])
    db.Delete(&resource)

    var resources []Resource
    db.Find(&resources)
    json.NewEncoder(w).Encode(&resources)
}

我认为我可以做类似的事情

db.Select("AVG(tts)")

我只是不确定如何将结果放入ttc列

1 个答案:

答案 0 :(得分:2)

由于发布请求的json已经包含tts_data,因此您可以在数据库中设置平均值之前获取平均值

sum := 0
for _, i := range tts_data {
 sum += i
}
avg := sum / len(tts_data)
// save the data in your db
rs := Ressource{Name: "name", TTS: tts_data, ttc: avg}
b := db.Create(&rs)
if b {
  // send all the resource
  json.NewEncoder(w).Encode(&rs)
  // or send only the avg
  json.NewEncoder(w).Encode(struct{avg: int}{avg: avg})
} else {
  // handle error
}