表題の通りなんですが、 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にコメント書きたい派なのでこれも不便だと思います。