tools/protobuf_export/main.go (68 lines of code) (raw):
// package Main queries Google BigQuery.
package main
import (
"context"
"fmt"
"io"
"log"
"os"
"cloud.google.com/go/bigquery"
"google.golang.org/api/iterator"
"google.golang.org/Protobuf/proto"
pb "path/to/proto/file_proto"
)
const (
projectID = "your-project-id"
)
// Row contains returned row data from bigquery.
type Row struct {
RowKey string `bigquery:"RowKey"`
Proto []byte `bigquery:"ProtoResult"`
}
func main() {
ctx := context.Background()
client, err := bigquery.NewClient(ctx, projectID)
if err != nil {
log.Fatalf("bigquery.NewClient: %v", err)
}
defer client.Close()
rows, err := query(ctx, client)
if err != nil {
log.Fatal(err)
}
if err := printResults(os.Stdout, rows); err != nil {
log.Fatal(err)
}
}
// query returns a row iterator suitable for reading query results.
func query(ctx context.Context, client *bigquery.Client) (*bigquery.RowIterator, error) {
query := client.Query(
`SELECT
concat(word, ":", corpus) as RowKey,
<dataset-id>.toMyProtoMessage(
STRUCT(
word,
CAST(word_count AS BIGNUMERIC)
)
) AS ProtoResult
FROM
` + "` bigquery - public - data.samples.shakespeare `" + `
LIMIT
100;
`)
return query.Read(ctx)
}
// printResults prints results from a query.
func printResults(w io.Writer, iter *bigquery.RowIterator) error {
for {
var row Row
err := iter.Next(&row)
if err == iterator.Done {
return nil
}
if err != nil {
return fmt.Errorf("error iterating through results: %w", err)
}
message := &pb.TestMessage{}
if err = proto.Unmarshal(row.Proto, message); err != nil {
return err
}
fmt.Fprintf(w, "rowKey: %s, message: %v\n", row.RowKey, message)
}
}