Как поместить AVG строки в новый столбец? - PullRequest
0 голосов
/ 30 сентября 2018

Привет всем, я использую golang для создания супер простого API.У меня есть эти данные JSON, передаваемые из запроса POST и хранятся в моей БД.Я хотел бы взять данные tts, которые являются целочисленным массивом, и усреднить этот массив, поместить его в столбец ttc и вернуть это число в ответе json.Я с трудом делаю, что любая помощь будет принята с благодарностью.Мой исходный код ниже, а также моя модель БД.Я знаю, что мне нужно как-то использовать функцию AVG () в postgres, но я новичок в 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 голосов
/ 30 сентября 2018

Поскольку 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...