如何在Heroku上使用golang连接到BigQuery

由于对结构非常感兴趣并进行了研究,我整理了以下内容。这些信息是截至2017年7月22日时的。由于在工作中找到并整理的,可能存在一些错误。

目标读者

    • BigQueryを用意したがAPIとして呼びたい

 

    • Go(golang)を使いたい

 

    Herokuなど、Webアプリケーションから動かしたい

进行一项任务的步骤

以下是大致的步骤:

    1. 在GCP上注册服务帐号

 

    1. 在Heroku上设置环境变量

 

    使其能够从Go调用

请参考其他人的文档,了解Heroku的使用方法、BigQuery的创建以及详细术语解释等。

在GCP上注册服务账户。

在目标项目中打开GCP的”身份验证和访问管理”。

1.png

添加服务账户

以下是角色分配。如果分配错误,将出现403禁止访问。

    • BigQuery データ閲覧者

 

    BigQuery ユーザー
2.png

以JSON格式下载密钥。

只要按照步骤进行,下载没有任何问题。

使用Heroku进行环境变量的设置。

在Heroku的以下界面上设置环境变量。
将KEY设置为“GOOGLE_APPLICATION_CREDENTIALS”,将VALUE设置为复制并粘贴以上下载的JSON文件。

3.png

可以通过命令进行设置。

使其可以从Go中被调用

以下是示例代码。暂时在本地(1.8.1版本)运行正常。
实际上,我将其作为API部署在Heroku上,并没有部署这段代码。

请注意,项目ID已经放在环境变量中。在本地环境中,设置如下:

# xxxにはプロジェクトIDとダウンロードしたjsonファイルです。
export PROJECT_ID=xxxxx
export GOOGLE_APPLICATION_CREDENTIALS="$(cat xxxxxx.json)"

以下是Go语言的源代码。类似于Gist的也放在了这里。

package main

import (
    "cloud.google.com/go/bigquery"
    "fmt"
    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    bq "google.golang.org/api/bigquery/v2"
    "google.golang.org/api/iterator"
    "google.golang.org/api/option"
    "os"
)

func main() {
    json := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")
    ctx := context.Background()
        // project ID も環境変数に入れています。
    projectID := os.Getenv("PROJECT_ID")
    jwtConfig, err := google.JWTConfigFromJSON([]byte(json), bq.BigqueryScope)
    if err != nil {
        fmt.Printf("Json load error: %v\n", err)
    }
    ts := jwtConfig.TokenSource(ctx)
    client, err := bigquery.NewClient(ctx, projectID, option.WithTokenSource(ts))
    if err != nil {
        fmt.Printf("Client create error: %v\n", err)
    }

                // SQL
    bqSql := " select * from [zip.zip] order by zip limit 10"
    fmt.Println(bqSql)

    q := client.Query(bqSql)
    it, err := q.Read(ctx)
    if err != nil {
        fmt.Printf("Error2: %v\n", err)
    }
    for {
        var values []bigquery.Value
        err := it.Next(&values)
        if err == iterator.Done {
            break
        }
        if err != nil {
            fmt.Printf("Error3: %v\n", err)
        }
        fmt.Printf(values[0].(string))
        fmt.Printf(values[1].(string))
    }
}

相关链接

    • Google Vision APIをHerokuで使う

 

    • package bigquery

 

    • GolangでBigQueryにデータを追加する

 

    pyohei/accessBigquery.go
广告
将在 10 秒后关闭
bannerAds