22
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【BigQuery】standardSQLのフォーマッターを公開した(各種エディタ対応)

Last updated at Posted at 2021-04-22

最新情報

  • version 0.2.27
  • VSCode拡張機能を公開
    • このフォーマッターを組み込んだBigQuery Extension For VSCodeという拡張機能を公開(まだα版)
    • ほとんどの機能はLanguage Serverとして実装したため、Vimなど他のエディタからも利用可能

概要

VimやVSCodeでも利用可能な standardSQL 1のフォーマッター prettier-plugin-bq を先日公開したため、開発した背景・特徴・使い方などを紹介する。開発初期に投稿した記事もあるが、どう開発するかに重点を置いていたため、この記事では どう使うか に重点を置く。まだ開発中の部分もあるが、version 0.1.0で(おそらく)一通りの文法に対応したため、興味があれば使ってみてください。

▼Vimからの利用イメージ(詳細は使い方を参照)
ezgif-6-55c08dc04c9f.gif

背景

SQLワークスペースの 【Format Query】 (日本語だと【クエリを書式設定】)を使ったことがあるだろうか。私は一度試して、 それ以降使うのをやめた 。理由は単純で、少なくとも2021年06月現在、まだ満足できる性能ではないと感じるから。
image.png

例えば以下がこの機能を利用した結果だが、明らかにクエリの意味が変わってしまっている(また、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

ezgif-6-d2fdaff080d4.gif

Vim (Neovim) からの利用

vim-prettierが便利。vim-plugを利用しているなら、以下を.vimrc (またはinit.vim)に追記して:PlugInstallを実行する4

init.vim
call plug#begin('~/.vim/plugged')
" ... other plugins
Plug 'prettier/vim-prettier', { 'do': 'yarn install' }
" ... other plugins
call plug#end()

これにより、:Prettierというコマンドで編集中の.sql.bqのファイルをフォーマット可能になる。デフォルトだと<leader>pに割り当てられるため、それでも実行可能。

ezgif-6-55c08dc04c9f.gif

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すればよさそう。
image.png
必要なら、Prettierを利用すると明示するためsetting.jsonに以下を記入しておく。

setting.json
{
    "editor.defaultFormatter": "esbenp.prettier-vscode"
}

ここまでで準備完了。Ctrl + Shift + Pでコマンドパレットを開き、Format Documentを選択すれば.sql.bqのファイルをフォーマットできる。

今後の展望

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

  • コードのリファクタリング
  • テストコードの充実構文解析器はテスト駆動開発したので、それ以外を重点的に)
  • エラーメッセージの充実
  • Prettierのpluginとして不足している機能の開発

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

  1. BigQueryで利用するSQLの一つ。標準SQLと直訳する場合もあるらしい。

  2. version 0.2.0で大文字に変換しないオプションも追加
    その他のコーディングスタイルは 「可読性は担保」 しつつ 「複雑な実装にしない」 という方針で決めている。

  3. パッケージ管理のためにnode_modules/ package.json, package-lock.jsonが作成される。Gitで管理する場合、node_modules/.gitignoreに追記しておくとよい。

  4. vim-plugのREADME通りの手順。おそらくyarnを使えるようにしておく必要あり。

22
11
3

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
22
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?