1
Help us understand the problem. What are the problem?

posted at

updated at

【BigQuery】standardSQLのLanguage Serverを公開した(VSCode拡張機能だけどVimもOK)

最新情報

  • Version 0.0.27

概要

先日公開した BigQuery Extension for VSCode というVSCode拡張機能の紹介。ほとんどの機能はLanguage Serverとして実装されており、Vimなど他のエディタからも利用可能。legacySQLは守備範囲外で、standardSQLに特化させた。

機能

VSCodeから拡張機能をインストールするだけでは動作しない機能もある。
全ての機能を使うには後述のセットアップを済ませること。

補完

列名や関数名の補完ができる(現状、列名の補完はSELECT文のみで機能する)。
`を入力するとプロジェクト名・データセット名・テーブル名の順で補完される。

ezgif.com-gif-maker (2).gif

関数については、使い方を確認のために簡単な例文も表示される。
image.png

フォーマット

以前作ったprettier-plugin-bq1によるフォーマットが利用可能(Shift + Alt + Fもしくはコマンドパレットから実行)。

ezgif.com-gif-maker (1).gif

テーブル定義の表示

カーソルをテーブル名に合わせると、列名やデータ型を表示する。現状、プロジェクト名からテーブル名までが`で囲まれていないと動作しない。

ezgif.com-gif-maker (4).gif

Dry Run

変更を保存する度にDry Runを実行し、処理されるデータ量を右下(ステータスバー)に表示する。

image.png

VSCode以外のエディタでも表示されるが、表示形式はクライアント側の実装による。後ほど紹介するVim & coc.nvimの場合は以下のようになる。
image.png

エラー検知

上記Dry Runのタイミングでエラーがあれば下線を引き、BigQueryからのメッセージを表示(下図のCURRNETTIMESTAMP)。それ以外のタイミングでも明らかに文法的な間違いがあれば下線を引き、構文解析器のエラーメッセージを表示(下図の;;;;;。エラーメッセージは改善の余地あり)。

ezgif.com-gif-maker (3).gif

言語特有の設定

VSCodeで通常ののSQLを編集すると`が自動で閉じられない、#以降がコメントとして認識されないといった問題があるので調整。これはLanguage Serverとしての機能ではないため、Vimなど他のエディタから利用する場合は無関係。

Before
image.png

After
image.png

セットアップ

ℹ️Windowsの場合、WSLの利用を推奨(このあたりが参考になるかと)

手順

  1. Google Cloud SDKをインストール
  2. gcloud auth login gcloud auth application-default loginコマンドを実行
  3. sqlite3をインストール2
  4. VSCodeでこの拡張機能をインストール(BigQuery Extension for VSCodeで検索)
  5. VSCodeでファイルを開く(拡張子は.bqもしくは.bigquery
  6. コマンドパレットからBQExtensionVSCode: UpdateCacheを実行

補足

BQExtensionVSCode: UpdateCacheは、テーブル名などを補完するために必要な情報を取得し、ローカルのsqlite3に保存するコマンド。INFROMATION_SCHEMAに対してクエリを実行するため、最低10MBのデータ処理が何回か走る

このデータ処理量を節約するため、クエリに登場しないデータセットは無視される。例えば以下のファイルを開いた状態でBQExtensionVSCode: UpdateCacheを実行すると、datasetname1datasetname2についての情報が取得される。一方で、BigQuery上にdatasetname3というデータセットが存在したとしても、その情報は取得しない。

xxx.bq
SELECT *
FROM
  `projectname.datasetname1.tablename`
  INNER JOIN `projectname.datasetname2.talbename` USING(column1)

おまけ

拡張機能を.sqlでも有効にする

デフォルトでは拡張子が.bq.bigqueryの場合のみ拡張機能が有効になる3。もし.sqlでも拡張機能を有効にしたいなら、以下の設定をsettings.jsonに記載する。

setting.json
{
  "files.associations": {
    "*.sql": "bigquery"
  }
}

Vimからの利用

理論上はLanguage Serverに対応していればどのエディタからでも利用可能。ここではVimを例に手順を紹介する。npmは利用可能な前提。

coc.nvimのインストール

まずLSPクライアントとしてcoc.nvimをインストールする4。名前に反して(Neovimだけでなく)Vimでも使えるらしい。vim-plugを導入済みなら.vimrcinit.vimに以下を追記して:PlugInstallするだけ。もしインストールに詰まったらWikiを確認すること。

.vimrc
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を指定している(詳述しないが、拡張子と一対一で対応する概念ではない。ドキュメントはこちら)。

coc-settings.json
{
  "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

`で閉じ括弧も入力されるよう、以下を.vimrcinit.vimに追記するのがおすすめ。ちゃんと閉じないと構文解析に支障が出る。

inoremap ` `<left>`

以上でセットアップ完了。下図のように補完も効くはず。

ezgif.com-gif-maker (5).gif

今後

今後は以下を進める予定。

  • コードのリファクタリング
  • 構文解析器の改善(多少エラーがあっても補完が効くようにする。一方でエラー検知は充実させる) 構文解析器ではなくLanguage Server側の調整で、SELECT * FROM `tablename` WHERE ;のような構文エラー状態からでも補完が効くように。
  • 補完機能を充実させる(現状、列名補完がSELECT文でしか効かない)
  • ホバーメッセージの充実(まだテーブル定義だけなのでそれ以外も)
  • INFROMATION_SCHEMAに対するクエリの削減(bq lsコマンドで代用できる部分はないか?)
  • スニペット機能の実装

ほかにもバグがあれば随時直すので、何かあれば教えてください。

  1. 過去記事で使い方などを紹介したが、この記事の拡張機能から利用する場合はこの記事のセットアップだけ済ませればよい。

  2. ターミナルでwhich sqlite3を実行して何らかのPATHが返ってくればOK。WindowsでもMacでも動くようにするにはコンパイルがネックになるため、あえてnode-sqlite3を使わなかった。

  3. BigQuery以外のSQLを書いているのに、保存する度Dry Runが走って煩わしい。。。ということが起きないよう配慮した。

  4. これも本当はcoc.nvimである必要はなく、好きなLSPクライアントを使ってよい。ただし、設定方法はそれぞれ異なるだろうから要確認。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?