如何在Heroku上使用golang连接到BigQuery
由于对结构非常感兴趣并进行了研究,我整理了以下内容。这些信息是截至2017年7月22日时的。由于在工作中找到并整理的,可能存在一些错误。
目标读者
-
- BigQueryを用意したがAPIとして呼びたい
-
- Go(golang)を使いたい
- Herokuなど、Webアプリケーションから動かしたい
进行一项任务的步骤
以下是大致的步骤:
-
- 在GCP上注册服务帐号
-
- 在Heroku上设置环境变量
- 使其能够从Go调用
请参考其他人的文档,了解Heroku的使用方法、BigQuery的创建以及详细术语解释等。
在GCP上注册服务账户。
在目标项目中打开GCP的”身份验证和访问管理”。
添加服务账户
以下是角色分配。如果分配错误,将出现403禁止访问。
-
- BigQuery データ閲覧者
- BigQuery ユーザー
以JSON格式下载密钥。
只要按照步骤进行,下载没有任何问题。
使用Heroku进行环境变量的设置。
在Heroku的以下界面上设置环境变量。
将KEY设置为“GOOGLE_APPLICATION_CREDENTIALS”,将VALUE设置为复制并粘贴以上下载的JSON文件。
可以通过命令进行设置。
使其可以从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