Windows PCにdbt-Coreをインストールしてサンプルを実行する


## 本投稿について

dbt-CoreをWindows PCにインストールし、サンプルコードを用いてdbt runを実行するまでの過程を記載します。
ほぼ自分用メモなので分かりにくいか部分もあるかと思われます。
なお、クラウド版製品であるdbt-Cloudは扱いません。

### dbt-Coreとは何か？

dbt (Data Build Tool) Coreは、データアナリストやデータエンジニアがSQLでデータ変換（データモデリング）を効率的に行うためのオープンソースツールです。
https://github.com/dbt-labs/dbt-core
このツールは、SQLクエリをモジュール化し再利用可能な分析コードに変換し、データワークフローを自動化する機能を提供します。
dbtは、バージョン管理、テスト、ドキュメントの生成をサポートし、データの品質とコードの信頼性を保証するためのベストプラクティスを導入するのに役立ちます。

## 今回構築する環境：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406801/e3b330b1-e4b3-e4b5-ea57-4481110cb93c.png)


1. DB：AWS-RDS（posrgreSQL）
2. ローカルPC：
    - OS：Windows11
    - エディタ・IDE：VS Code
    - Python
        - 仮想環境
        - dbt-Core
            ※dbt-CoreはPyPI(Python Package Indexで配布されているPythonモジュールです)
    - git（簡単のため、gitはインストールするだけでリポジトリ連携は行なってない）

## 準備～サンプル実行まで

### 準備1. ローカル環境（Windows PC）の準備

1. Pythonをインストールする
    まだPythonをインストールしていない場合、Pythonをインストールします。
    https://www.python.org/downloads/windows/
2. 仮想環境を作成する
    今回はディレクトリ`C:\study\dbt`を用意し、その配下に仮想環境を作成します。
    以下のコマンドをPowershellで実行することにより、`\.venv`ディレクトリにPythonの仮想環境を作成し、仮想環境をアクティベートします。
 
   ```
   -- 仮想環境の作成
   PS C:\study\dbt>py -m venv .venv
   --(Powershellの場合、初回のみこのコマンド必要)
   PS C:\study\dbt>Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
   -- 仮想環境を活性化
   PS C:\study\dbt>.venv\Scripts\activate
   ```
3. 仮想環境に必要なパッケージをインストールする
    2で仮想環境のアクティベートが成功しているので、今回のサンプル実行に必要なパッケージをインストールします。
   ```
   (.venv) PS C:\study\dbt> pip install dbt-core
   (.venv) PS C:\study\dbt> pip install dbt-postgres
   ```

1. gitをインストールする
    Gitが入ってないと後工程のdbt debugでエラーが起きるので入れておく。
   1. https://git-scm.com/download/win
    からWindows用のインストーラを入手してインストールする
    1. エディタはVS Codeを選択する
    2. インストール実施後、VS Codeを再起動する

### 準備2. DBを用意する

今回は無料枠を使いたいのでAWS-RDSのPostgresインスタンス採用した。
ローカルから接続できるようにSGの設定も行う必要があるので注意。
（Snowflakeは試用期間が短いため、1年間無料のAWSを使ってみる。
　一番手っ取り早いのはPCのローカルにDBを立てる方法ですが、
 　PCにDBを立てたくないのでRDSを使いました。）

1. AWS-RDSにインスタンスを構築する
   1. AWS-RDSサービスでPostgresインスタンスを立てる
   2. DBインスタンスのパブリックアクセスを許可する
   3. セキュリティグループのインバウンドルールにローカルのIPアドレスを追加する 

※このタイミングでやっておくと良いこと
- ここではDBのホスト名、ユーザー名、パスワードを控えておく。
- pgAdmin等のツールをローカルPCにインストールしてローカルPCからDBに接続できるか確認しておくと良い。
- dbtのテスト用にスキーマを分けたい場合は作成しておく。

### 準備3. dbt init、dbt debugのテスト

2. dbt init を実行する
    各種パラメータを正しく設定すれば通るはず
    ```
    Which database would you like to use?
    [1] postgres
    [2] snowflake
    (Don't see the one you want? https://docs.getdbt.com/docs/available-adapters)
    Enter a number: 1
    host (hostname for the instance): XXXXXXXXXXXXXXXXXXXX
    port [5432]:
    user (dev username): XXXXXXXX
    pass (dev password): XXXXXXXX
    dbname (default database that dbt will build objects in): postgres
    schema (default schema that dbt will build objects in): dbt-schema
    threads (1 or more) [1]: 1
    14:06:07  Profile dbt_test written to C:\Users\sh1r4\.dbt\profiles.yml using target's profile_template.yml and your supplied values. Run 'dbt debug' to validate the connection.
    ```
1. dbt debugを実行する
    ここまでの設定がうまくいっていれば成功するはず
    ```
    (略)
    14:28:12  Registered adapter: postgres=1.7.13
    14:28:12    Connection test: [OK connection ok]

    14:28:12  All checks passed!
    ```

### テスト実行：models/example配下の資材を使ってdbt runしてみる
dbt initを行うとmodels/example配下に2種類の.sqlファイルが作成されている。
- my_first_dbt_model.sql
- my_second_dbt_model.sql

上記2ファイルをdbt runで実行する

```
(.venv) PS C:\study\dbt\dbt_test> dbt run
12:57:40  Running with dbt=1.7.13
12:57:40  Registered adapter: postgres=1.7.13
12:57:40  Unable to do partial parsing because saved manifest not found. Starting full parse.
12:57:42  Found 2 models, 4 tests, 0 sources, 0 exposures, 0 metrics, 401 macros, 0 groups, 0 semantic models
12:57:42
12:57:43  Concurrency: 1 threads (target='dev')
cond_dbt_model ..................... [RUN]
12:57:43  2 of 2 OK created sql view model dbt-schema.my_second_dbt_model ................ [CREATE VIEW in 0.30s]
12:57:43
12:57:44  Finished running 1 table model, 1 view model in 0 hours 0 minutes and 1.44 seconds (1.44s).
12:57:44
12:57:44  Completed successfully
12:57:44
12:57:44  Done. PASS=2 WARN=0 ERROR=0 SKIP=0 TOTAL=2
```

無事実行成功すると、TableとViewが1個ずつ作成されている。
（画像はpgAdmin4のキャプチャ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406801/b5bab6ee-e951-33f0-0418-e143eabcca37.png)

以上です！
dbtにはデータモデリングを効率化する機能が色々あるので試していきましょう。