Хост API-сервер, чтобы ударить Big Query и отобразить на веб-странице - PullRequest
0 голосов
/ 13 февраля 2019

Я хотел бы создать хост-сервер API, который будет работать с BigQuery и отображать результаты запроса на веб-странице.

Мне удалось создать реальный сервер, который отображает информацию с помощью метода GET (на основе дат).Кроме того, у меня есть отдельный код, который может получить данные из BigQuery.Но, к сожалению, у меня недостаточно знаний, чтобы объединить их вместе.

Это текущий код:

Сервер с попытками объединения:

package main

import (
    "fmt"
    "io"
    "net/http"
    "os"

    "cloud.google.com/go/civil"
)

type bqStructure struct {
    SQLDate        civil.Date `bigquery:"SQLDate"`
    LocalStoreID   string     `bigquery:"LocalStoreID"`
    LocalStoreName string     `bigquery:"LocalStoreName"`
    Longitude      float64    `bigquery:"Longitude"`
    Latitude       float64    `bigquery:"Latitude"`
    LONG_LAT       string     `bigquery:"lonLat"`
    PLU            string     `bigquery:"PLU"`
    PluProductName string     `bigquery:"PluProductName"`
    ORDERED        string     `bigquery:"Ordered"`
    SOLD           string     `bigquery:"Sold"`
    IMAGE_URL      string     `bigquery:"ImageURL"`
}

func queryParamDisplayHandler(res http.ResponseWriter, req *http.Request) {
    io.WriteString(res, "StartDate: "+req.FormValue("start"))
    io.WriteString(res, "\nEndDate: "+req.FormValue("end"))

}

func main() {
    proj := os.Getenv("GOOGLE_CLOUD_PROJECT")
    if proj == "" {
        fmt.Println("GOOGLE_CLOUD_PROJECT environment variable must be set.")
        os.Exit(1)
    }

    http.HandleFunc("/map", func(res http.ResponseWriter, req *http.Request) {
        queryParamDisplayHandler(res, req)
    })
    println("Enter this in your browser:  http://localhost:80/example?start=20180101&end=20190101")
    http.ListenAndServe(":80", nil)
}

И этоКак я нажимаю на BigQuery:

package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "os"

    "cloud.google.com/go/bigquery"
    "cloud.google.com/go/civil"
    "google.golang.org/api/iterator"
)

func main() {
    proj := os.Getenv("GOOGLE_CLOUD_PROJECT")
    if proj == "" {
        fmt.Println("GOOGLE_CLOUD_PROJECT environment variable must be set.")
        os.Exit(1)
    }

    rows, err := query(proj)
    if err != nil {
        log.Fatal(err)
    }
    if err := printResults(os.Stdout, rows); err != nil {
        log.Fatal(err)
    }
}

// query returns a slice of the results of a query.
func query(proj string) (*bigquery.RowIterator, error) {
    ctx := context.Background()

    client, err := bigquery.NewClient(ctx, proj)
    if err != nil {
        return nil, err
    }

    query := client.Query(`SELECT * FROM ` + "`XXXXX.XXXX.XXXX`" + `LIMIT 1000`)
    return query.Read(ctx)
}

type StackOverflowRow struct {
    SQLDate        civil.Date `bigquery:"SQLDate"`
    LocalStoreID   string     `bigquery:"LocalStoreID"`
    LocalStoreName string     `bigquery:"LocalStoreName"`
    Longitude      float64    `bigquery:"Longitude"`
    Latitude       float64    `bigquery:"Latitude"`
    LONG_LAT       string     `bigquery:"lonLat"`
    PLU            string     `bigquery:"PLU"`
    PluProductName string     `bigquery:"PluProductName"`
    ORDERED        string     `bigquery:"Ordered"`
    SOLD           string     `bigquery:"Sold"`
    IMAGE_URL      string     `bigquery:"ImageURL"`
}

func printResults(w io.Writer, iter *bigquery.RowIterator) error {
    for {
        var row StackOverflowRow
        err := iter.Next(&row)
        if err == iterator.Done {
            return nil
        }
        if err != nil {
            return err
        }

        fmt.Fprintf(w, "SQLDate: %s LocalStoreID: %s LocalStoreName: %s Longitude: %f Latitude: %f LONG_LAT: %s PLU: %s PluProductName: %s ORDERED: %s SOLD: %s IMAGE_URL: %s\n", row.SQLDate, row.LocalStoreID, row.LocalStoreName, row.Longitude, row.Latitude, row.LONG_LAT, row.PLU, row.PluProductName, row.ORDERED, row.SOLD, row.IMAGE_URL)
    }
}

Я хотел бы найти способ размещения сервера и получать информацию из BigQuery на основе переменных START и END, которые должны отображаться на веб-странице.

Ссылка для отображения результатов с сервера - http://localhost:80/map?start=20180101&end=20190101

Все работает отдельно, поэтому каждый код работает

ПОСЛЕДНИЕ ОБНОВЛЕНИЯ:

Работает, НО информация с BQ отображается в терминале, необходимо отправить ее на веб-страницу.

package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "net/http"
    "os"

    "cloud.google.com/go/bigquery"
    "cloud.google.com/go/civil"
    "google.golang.org/api/iterator"
)

type bqStructure struct {
    SQLDate        civil.Date `bigquery:"SQLDate"`
    LocalStoreID   string     `bigquery:"LocalStoreID"`
    LocalStoreName string     `bigquery:"LocalStoreName"`
    Longitude      float64    `bigquery:"Longitude"`
    Latitude       float64    `bigquery:"Latitude"`
    LONG_LAT       string     `bigquery:"lonLat"`
    PLU            string     `bigquery:"PLU"`
    PluProductName string     `bigquery:"PluProductName"`
    ORDERED        string     `bigquery:"Ordered"`
    SOLD           string     `bigquery:"Sold"`
    IMAGE_URL      string     `bigquery:"ImageURL"`
}

func query(proj string) (*bigquery.RowIterator, error) {

    ctx := context.Background()

    client, err := bigquery.NewClient(ctx, proj)
    if err != nil {
        return nil, err
    }

    query := client.Query(`SELECT * FROM ` + "`XXX`" + `LIMIT 1000`)
    return query.Read(ctx)
}

func printResults(w io.Writer, iter *bigquery.RowIterator) error {
    for {
        var row bqStructure
        err := iter.Next(&row)
        if err == iterator.Done {
            return nil
        }
        if err != nil {
            return err
        }

        fmt.Fprintf(w, "SQLDate: %s LocalStoreID: %s LocalStoreName: %s Longitude: %f Latitude: %f LONG_LAT: %s PLU: %s PluProductName: %s ORDERED: %s SOLD: %s IMAGE_URL: %s\n", row.SQLDate, row.LocalStoreID, row.LocalStoreName, row.Longitude, row.Latitude, row.LONG_LAT, row.PLU, row.PluProductName, row.ORDERED, row.SOLD, row.IMAGE_URL)
    }
}

func queryParamDisplayHandler(proj string, res http.ResponseWriter, req *http.Request) {

    io.WriteString(res, "StartDate: "+req.FormValue("start"))
    io.WriteString(res, "\nEndDate: "+req.FormValue("end"))

    rows, err := query(proj)
    if err != nil {
        log.Fatal(err)
    }
    if err := printResults(os.Stdout, rows); err != nil {
        log.Fatal(err)
    }

}

func main() {
    proj := os.Getenv("GOOGLE_CLOUD_PROJECT")
    if proj == "" {
        fmt.Println("GOOGLE_CLOUD_PROJECT environment variable must be set.")
        os.Exit(1)
    }

    http.HandleFunc("/map", func(res http.ResponseWriter, req *http.Request) {
        queryParamDisplayHandler(proj, res, req)
    })
    println("Enter this in your browser:  http://localhost:80/map?start=20180101&end=20190101")
    http.ListenAndServe(":80", nil)
}

Нужно найти, как преобразовать это

fmt.Fprintf(w, "SQLDate: %s LocalStoreID: %s LocalStoreName: %s Longitude: %f Latitude: %f LONG_LAT: %s PLU: %s PluProductName: %s ORDERED: %s SOLD: %s IMAGE_URL: %s\n", row.SQLDate, row.LocalStoreID, row.LocalStoreName, row.Longitude, row.Latitude, row.LONG_LAT, row.PLU, row.PluProductName, row.ORDERED, row.SOLD, row.IMAGE_URL)

, чтобы иметь возможностьотобразить на веб-странице ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...