最新情報
-
version 0.2.27
- 2022/08/03までのリリースノートに対応
- qualify周りのサイレント修正に対応
- VSCode拡張機能を公開
- このフォーマッターを組み込んだBigQuery Extension For VSCodeという拡張機能を公開(まだα版)
- ほとんどの機能はLanguage Serverとして実装したため、Vimなど他のエディタからも利用可能
概要
VimやVSCodeでも利用可能な standardSQL 1のフォーマッター prettier-plugin-bq を先日公開したため、開発した背景・特徴・使い方などを紹介する。開発初期に投稿した記事もあるが、どう開発するかに重点を置いていたため、この記事では どう使うか に重点を置く。まだ開発中の部分もあるが、version 0.1.0
で(おそらく)一通りの文法に対応したため、興味があれば使ってみてください。
▼Vimからの利用イメージ(詳細は使い方を参照)
背景
SQLワークスペースの 【Format Query】 (日本語だと【クエリを書式設定】)を使ったことがあるだろうか。私は一度試して、 それ以降使うのをやめた 。理由は単純で、少なくとも2021年06月現在、まだ満足できる性能ではないと感じるから。
例えば以下がこの機能を利用した結果だが、明らかにクエリの意味が変わってしまっている(また、BETWEEN xxx AND yyy
の改行も気に入らない)。これが開発に着手した動機である。
-- フォーマット前
declare start_date default 1590;
declare end_date default 1600;
select
corpus, -- comment
word_count as love_count
from `bigquery-public-data`.samples.shakespeare
where corpus_date between start_date and end_date and word = "love"
order by love_count desc
;
-- フォーマット後
DECLARE
start_date DEFAULT 1590;
DECLARE
end_date DEFAULT 1600;
SELECT
corpus,
-- comment word_count AS love_count
FROM
`bigquery-public-data`.samples.shakespeare
WHERE
corpus_date BETWEEN start_date
AND end_date
AND word = "love"
ORDER BY
love_count DESC ;
特徴
今回公開したprettier-plugin-bqには以下のような特徴がある。
Prettierの拡張機能として実装
Prettierというフォーマッターの拡張機能(plugin)として実装したため、Prettierが対応していればどのエディタからでも利用可能。チームでコーディングスタイルを統一するのも容易。
standardSQLに特化
リリースノートを見ての通り、BigQueryはかなり頻繁に新機能が追加される。今後個人でもメンテを続けられるよう、standardSQLのみを対象とした。逆に言えばPostgreSQL・MySQLなど他のRDBMSについては考えないし、同じBigQueryでもlegacySQLについては考えない。
後カンマ、予約語大文字、...
コーディングスタイルについても軽く言及しておく。
まずSELECT句などでは後カンマを採用する。standardSQLでは以下のような記法が許されており、後カンマでも列の追加・削除に不都合がないため。
SELECT
col1,
col2, -- この位置のカンマも許される
また、予約語はデフォルトだと大文字に変換される2。速く書けるから予約語も小文字推奨、というスタンスもあるようだが、フォーマッターを使って変換するなら関係ないため。
使い方
動作確認はWSL2のUbuntu-20.04で実施した。npm
は事前に使えるようにしておくこと。後段でコマンドライン・Vim・VSCodeからの利用方法を紹介するが、まずはフォーマッターを利用したいプロジェクト内で、以下の通りインストール3。
npm init -y
npm install --save-dev --save-exact prettier @dr666m1/prettier-plugin-bq # prettier本体もインストール
コマンドラインからの利用
拡張子が.sql
または.bq
のファイルを指定して、以下のコマンドを実行する。この方法だとファイルがフォーマットされた状態で上書きされる。--write
を--check
で置き換えて、フォーマット済みか確認するといった使い方もできる。詳細はPrettierのドキュメントを参照されたい。
npx prettier --write ./xxx.sql
Vim (Neovim) からの利用
vim-prettierが便利。vim-plugを利用しているなら、以下を.vimrc
(またはinit.vim
)に追記して:PlugInstall
を実行する4。
call plug#begin('~/.vim/plugged')
" ... other plugins
Plug 'prettier/vim-prettier', { 'do': 'yarn install' }
" ... other plugins
call plug#end()
これにより、:Prettier
というコマンドで編集中の.sql
や.bq
のファイルをフォーマット可能になる。デフォルトだと<leader>p
に割り当てられるため、それでも実行可能。
VSCodeからの利用
まずはWindowsの場合を、Remote-WSLを使う前提で解説する(Remote-WSLの導入はこちらの記事が詳しい)。先ほどnpm install
を実行したディレクトリでVSCodeを起動(code .
を実行)し、ExtensionsをPrettier - Code formatter
で検索。そしてprettier-vscodeをインストール。
macの場合はprettier-vscodeをインストールして、先ほどnpm init -y
したディレクトリをVSCodeから普通にopen folderすればよさそう。
必要なら、Prettierを利用すると明示するためsetting.json
に以下を記入しておく。
{
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
ここまでで準備完了。Ctrl + Shift + P
でコマンドパレットを開き、Format Document
を選択すれば.sql
や.bq
のファイルをフォーマットできる。
今後の展望
今後は以下を進める予定。
コードのリファクタリング-
テストコードの充実(構文解析器はテスト駆動開発したので、それ以外を重点的に) エラーメッセージの充実- Prettierのpluginとして不足している機能の開発
ほかにもバグがあれば随時直すので、何かあれば教えてください。