Я хотел бы создать хост-сервер 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)
, чтобы иметь возможностьотобразить на веб-странице ???