最新情報
-
Version 0.0.27
- 2022/08/03までのリリースノートに対応
- qualify周りのサイレント修正に対応
概要
先日公開した BigQuery Extension for VSCode というVSCode拡張機能の紹介。ほとんどの機能はLanguage Serverとして実装されており、Vimなど他のエディタからも利用可能。legacySQLは守備範囲外で、standardSQLに特化させた。
機能
VSCodeから拡張機能をインストールするだけでは動作しない機能もある。
全ての機能を使うには後述のセットアップを済ませること。
補完
列名や関数名の補完ができる(現状、列名の補完はSELECT文のみで機能する)。
`
を入力するとプロジェクト名・データセット名・テーブル名の順で補完される。
関数については、使い方を確認のために簡単な例文も表示される。
フォーマット
以前作ったprettier-plugin-bq1によるフォーマットが利用可能(Shift
+ Alt
+ F
もしくはコマンドパレットから実行)。
テーブル定義の表示
カーソルをテーブル名に合わせると、列名やデータ型を表示する。現状、プロジェクト名からテーブル名までが`
で囲まれていないと動作しない。
Dry Run
変更を保存する度にDry Runを実行し、処理されるデータ量を右下(ステータスバー)に表示する。
VSCode以外のエディタでも表示されるが、表示形式はクライアント側の実装による。後ほど紹介するVim & coc.nvimの場合は以下のようになる。
エラー検知
上記Dry Runのタイミングでエラーがあれば下線を引き、BigQueryからのメッセージを表示(下図のCURRNETTIMESTAMP
)。それ以外のタイミングでも明らかに文法的な間違いがあれば下線を引き、構文解析器のエラーメッセージを表示(下図の;;;;;
。エラーメッセージは改善の余地あり)。
言語特有の設定
VSCodeで通常ののSQLを編集すると`
が自動で閉じられない、#
以降がコメントとして認識されないといった問題があるので調整。これはLanguage Serverとしての機能ではないため、Vimなど他のエディタから利用する場合は無関係。
セットアップ
ℹ️Windowsの場合、WSLの利用を推奨(このあたりが参考になるかと)
手順
- Google Cloud SDKをインストール
-
gcloud auth login
gcloud auth application-default login
コマンドを実行 - sqlite3をインストール2
- VSCodeでこの拡張機能をインストール(
BigQuery Extension for VSCode
で検索) - VSCodeでファイルを開く(拡張子は
.bq
もしくは.bigquery
) - コマンドパレットから
BQExtensionVSCode: UpdateCache
を実行
補足
BQExtensionVSCode: UpdateCache
は、テーブル名などを補完するために必要な情報を取得し、ローカルのsqlite3に保存するコマンド。INFROMATION_SCHEMAに対してクエリを実行するため、最低10MBのデータ処理が何回か走る。
このデータ処理量を節約するため、クエリに登場しないデータセットは無視される。例えば以下のファイルを開いた状態でBQExtensionVSCode: UpdateCache
を実行すると、datasetname1
とdatasetname2
についての情報が取得される。一方で、BigQuery上にdatasetname3
というデータセットが存在したとしても、その情報は取得しない。
SELECT *
FROM
`projectname.datasetname1.tablename`
INNER JOIN `projectname.datasetname2.talbename` USING(column1)
おまけ
拡張機能を.sqlでも有効にする
デフォルトでは拡張子が.bq
か.bigquery
の場合のみ拡張機能が有効になる3。もし.sql
でも拡張機能を有効にしたいなら、以下の設定をsettings.json
に記載する。
{
"files.associations": {
"*.sql": "bigquery"
}
}
Vimからの利用
理論上はLanguage Serverに対応していればどのエディタからでも利用可能。ここではVimを例に手順を紹介する。npmは利用可能な前提。
coc.nvimのインストール
まずLSPクライアントとしてcoc.nvimをインストールする4。名前に反して(Neovimだけでなく)Vimでも使えるらしい。vim-plugを導入済みなら.vimrc
やinit.vim
に以下を追記して:PlugInstall
するだけ。もしインストールに詰まったらWikiを確認すること。
call plug#begin('~/.vim/plugged')
" ... other plugins
Plug 'neoclide/coc.nvim', {'branch': 'release'}
" ... other plugins
call plug#end()
Language Serverのインストール
以下のコマンドを実行する。npmパッケージとして公開していないため、GitHubリポジトリをcloneするところから。
git clone https://github.com/dr666m1/bq-extension-vscode.git
cd bq-extension-vscode
npm install
npm run compile
cd server
npm install -g .
coc.nvimの設定
coc-settings.json
に以下を追記。ファイルがどこにあるかわからなくても:CocConfig
で開けるはず。filetypesは:echo &filetype
したら表示されるもので、ここではsqlとbqを指定している(詳述しないが、拡張子と一対一で対応する概念ではない。ドキュメントはこちら)。
{
"languageserver": {
"bigquery": {
"command": "bq-language-server",
"args": ["--stdio"],
"filetypes": ["sql", "bigquery"],
"settings": {
"bqExtensionVSCode": {
"diagnostic": {
"forVSCode": false
}
}
}
}
}
}
UpdateCache
filetypeがsqlかbigqueryのファイルを開いたら、:call CocRequestAsync("bigquery", "bq/updateCache")
でテーブル定義などの情報を取得する。
map
`
で閉じ括弧も入力されるよう、以下を.vimrc
やinit.vim
に追記するのがおすすめ。ちゃんと閉じないと構文解析に支障が出る。
inoremap ` `<left>`
以上でセットアップ完了。下図のように補完も効くはず。
今後
今後は以下を進める予定。
- コードのリファクタリング
-
構文解析器の改善(多少エラーがあっても補完が効くようにする。一方でエラー検知は充実させる)構文解析器ではなくLanguage Server側の調整で、SELECT * FROM `tablename` WHERE ;
のような構文エラー状態からでも補完が効くように。 - 補完機能を充実させる(現状、列名補完がSELECT文でしか効かない)
ホバーメッセージの充実(まだテーブル定義だけなのでそれ以外も)INFROMATION_SCHEMAに対するクエリの削減(bq ls
コマンドで代用できる部分はないか?)- スニペット機能の実装
ほかにもバグがあれば随時直すので、何かあれば教えてください。
-
ターミナルで
which sqlite3
を実行して何らかのPATHが返ってくればOK。WindowsでもMacでも動くようにするにはコンパイルがネックになるため、あえてnode-sqlite3を使わなかった。 ↩ -
BigQuery以外のSQLを書いているのに、保存する度Dry Runが走って煩わしい。。。ということが起きないよう配慮した。 ↩
-
これも本当はcoc.nvimである必要はなく、好きなLSPクライアントを使ってよい。ただし、設定方法はそれぞれ異なるだろうから要確認。 ↩