VSCode で dbt プロジェクトを快適に書く方法 (BigQuery)

この記事は [dbt Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dbt) 12日目の記事です。

VSCode を使って、dbt + BigQuery のプロジェクトを快適にすすめるのに役立つ拡張機能をいくつか紹介したいと思います。

※予定では、dbt metircs や Semantic Layer について書くつもりでしたが変更しました。
※DWH として BigQuery を利用することを前提としています。
※dbt-bigquery プロジェクトの基本的なことはご理解されている方を対象にしています。

## 紹介する VSCode 拡張機能一覧

- [Wizard for dbt Core (TM)](https://marketplace.visualstudio.com/items?itemName=Fivetran.dbt-language-server)
    - dbt の Language Server
- [BigQuery Runner](https://marketplace.visualstudio.com/items?itemName=minodisk.bigquery-runner)
    - VSCode 内から BigQuery にクエリ実行
- [sqlfluff](https://marketplace.visualstudio.com/items?itemName=dorzey.vscode-sqlfluff)
    - BigQuery, dbt にも対応した SQL Linter/Formatter


#### [Wizard for dbt Core (TM)](https://marketplace.visualstudio.com/items?itemName=Fivetran.dbt-language-server)

dbt プロジェクトにコード補完・クエリのプレビューなどの機能を追加してくれます。位置づけとしては、dbt の [Language Server](https://microsoft.github.io/language-server-protocol/) のようです。


##### セットアップ

- 必要なパッケージをインストール。`pip install dbt-rpc`
- リアルタイムでクエリのコンパイル結果を見るために、ファイルの自動保存を有効にすることが推奨されているため、必要に応じて、`"files.autoSave": "afterDelay"` などと設定。(必須ではない)

##### 機能

- クエリのプレビュー (コンパイル) 
    - Ctrl-p: `WidardForDbtCore(TM): Show query preview`

![公式の gif (プレビュー)](https://github.com/fivetran/dbt-language-server/raw/main/images/query-preview.gif)

- クエリのシンタックスチェック

![公式の gif (シンタックスチェック)](https://github.com/fivetran/dbt-language-server/raw/main/images/error-highlighting.gif)

- コード補完
    - テーブル
    - カラム
    - dbt macro
    - 関数 (BigQuery のみ)

![公式の gif (コード補完)](https://github.com/fivetran/dbt-language-server/raw/main/images/ref-auto-completion.gif)

- その他機能
    - model や macro の定義へのジャンプ
    - 関数のシグネチャーヘルプ (BigQuery のみ)


#### 総評

これまで、クエリに問題があると `dbt compile` して、`target/` から問題のクエリを探して、BigQuery のコンソールに貼り付けて、とやっていました。このフローを何とかしたいと思っていたのですが、この拡張機能によって、VSCode 内でコンパイルされたクエリをリアルタイムで確認しながら書くことができるようになりました。

まだ、拡張機能としては Preview の位置付けなので、model や source を作成してから、 補完候補に現れるまでにタイムラグがあったり、あるはずのカラム名が補完候補に出ないことがあったりしますが、総じて生産性を大きく上げてくれる拡張ではないかと思います。

#### [BigQuery Runner](https://marketplace.visualstudio.com/items?itemName=minodisk.bigquery-runner)

##### セットアップ

- 以下のいずれかの方法で認証
    - Ctrl-p: `BigQuery Runner: Login` でユーザー認証
    - 事前に `gcloud auth application-default login` を実行しておく
- 設定 `"bigqueryRunner.projectId"` でプロジェクト名を指定

※サービスアカウントを利用する方法については、[公式のドキュメント](https://marketplace.visualstudio.com/items?itemName=minodisk.bigquery-runner) を参照


##### 機能

VSCode のエディタ画面から、BigQuery にクエリを投げられるようになります (Ctrl-P: `BigQuery Runner: Run`)。

![公式の gif](https://user-images.githubusercontent.com/514164/180352233-ed635538-f064-4389-814a-c3ec306aa832.gif)

基本的には、`dbt run` でクエリを実行するのですが、開発中ではインタラクティブに修正内容を確認したいことが多々あります。そんなときは、前述のリアルタイムプレビューから、コンパイルされたクエリに移動し、`BigQuery Runner: Run` するというフローが強力で、ターミナルや BQ の Web コンソールを行ったり来たりする必要がなくなります。


#### [sqlfluff](https://marketplace.visualstudio.com/items?itemName=dorzey.vscode-sqlfluff)

[sqlfluff](https://github.com/sqlfluff/sqlfluff) は Python 製 の SQL Linter/Formatter です。dialect としてBigQuery をサポートしているだけでなく、テンプレートエンジンとして、dbt や Jinja などもサポートしています。カスタマイズできる項目も多く、個人的に SQL Linter/Formatter の決定版かなと思っています。

##### セットアップ

- `sqlfluff` をインストール。`pip install sqlfluff`
- `.sqlfluff` 設定ファイルを用意
- VSCode でフォーマッターの設定を追加 `"[sql]": {"editor.defaultFormatter": "dorzey.vscode-sqlfluff"}`

例えば、`.sqlfluff` で「タブ幅は2」「予約後は大文字」というルールを書くとすると以下のような設定になります。
``` conf
[sqlfluff]
dialect = bigquery

[sqlfluff:rules]
tab_space_size = 2

[sqlfluff:rules:L010]
capitalisation_policy = upper
```

### 機能

`Ctrl-P: Format Document` で設定したルールで、クエリを整形してくれます。


#### 最後に

dbt のコミュニティはさらにこれから成長していきそうなので、VSCode の拡張機能も今後さらに便利なものが出てくるんじゃないかと期待しています。もし良さそうなものを見つけ次第、記事も更新していきたいと思っています。