ありものの BigQuery プロジェクトで定義されているビュー群を素朴に Dataform の sqlx ファイル化する

(Dataform とは https://dataform.co/ のことです)

要件

  • ref() を使ったテーブル間参照についてはとりあえず考えないことにする
  • BigQuery の dataset 名と、Dataform の definitions/ 内のディレクトリ構成をなんとなく一致させたい

ってことで、Ruby でこういうかんじでできると思う。google-cloud-bigquery gem とかですらなくて bq CLI を叩いてるだけであまりに素朴だけど、まあふつうに出来てしまうわけだからいいかという気持ちです

require 'json'
require 'fileutils'

target_project = 'super-gcp-bigdata-project'
target_datasets = %w{nantoka__mart nantoka__warehouse}

dataform_repo_root = '/path/to/dataform-linked-repo-root/'

target_datasets.each do |dataset_name|
  FileUtils.mkdir_p File.join(dataform_repo_root, "definitions/#{dataset_name}")
  res = JSON.parse(`bq query --format prettyjson --location asia-northeast1 --use_legacy_sql=false 'SELECT * FROM #{target_project}.#{dataset_name}.INFORMATION_SCHEMA.VIEWS;'`)
  res.each do |table|
    table_name = table["table_name"]
    query = table["view_definition"]

    path = "definitions/#{dataset_name}/#{table_name}.sqlx"
    dest_path = File.join(dataform_repo_root, path)

    File.open(dest_path, "w") do |f|

      f.write(<<EOF
config {
  type: "view",
  schema: "#{dataset_name}",
}

#{query}
EOF
             )
    end
  end
end

これを実行すると '/path/to/dataform-linked-repo-root/'ディレクトリ下に sqlx ファイルがだかだか発射されるということになるので、それを目視で軽く確認しながら手でコミット & master ブランチ的存在にマージ、とするとよい、という想定。

ミソ