LoginSignup
5
2

More than 3 years have passed since last update.

BigQueryでファイルに書かれたクエリを実行したい

Last updated at Posted at 2019-07-10

表題の通りなんですが、 bq query でファイルに書かれたクエリを実行したいときに悩んだのでまとめておきます。

正解:標準入力経由

$ bq query --use_legacy_sql=false < foobar.sql

上のように標準入力経由で動くことは動くんですが、公式のオンラインドキュメントにそのような記述を見つけられず結構悩みました。

下記の通り bq query --help にstdinから読むよと書いてあったので安心して使っていいと思います。

$ bq query --help
Python script for interacting with BigQuery.


USAGE: bq [--global_flags] <command> [--command_flags] [args]


query      Execute a query.

           Query should be specifed on command line, or passed on stdin.

ググると謎のテクニックが見つかるけどオススメしない

下記のように--flagfileオプションを使えばSQL実行できるという書き込みをStack Overflowで見つけましたが、オススメしません。これは別の用途のオプションを指定してファイルを読んだときに正しく解釈できなかった残りがクエリとして解釈されるらしいです。バグみたいなものだと思うので、使わない方がいいでしょう。

$ bq --flagfile=foobar.sql query --use_legacy_sql=false

クエリをコマンドラインに展開する方法も見つかるけどオススメしない

下記のようにファイルの内容をコマンドライン引数として使う方法も紹介されてるんですが、これもオススメしません。

$ bq query --use_legacy_sql=false "$(cat foobar.sql)"

上のように書けばそこそこ動くんですが、下記のようにSQLにコメントを書くと死にます。

with-comment.sql
-- なんか表示したい
SELECT 'Hello, World!';
$ bq query --use_legacy_sql=false "$(cat with-comment.sql)"
FATAL Flags parsing error: Unknown command line flag ' なんか表示したい
SELECT 'Hello, World!';'
Run 'bq help' to get help

このやり方だとSQLコメントも改行なしでコマンドラインに展開されてしまうので、コマンドラインオプションとして扱われてしまって期待通りに動かないのです。

私はSQLにコメント書きたい派なのでこれも不便だと思います。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2