「手動SQL」という名の悪夢
50個もの長いSQLファイルの中で「溺れた」ことはありませんか?あるファイルはローカルPCに、あるファイルはサーバー上に散らばっている。売上計算のロジックが変わるたびに、一つ一つのファイルを探し出し、手動でコマンドを実行し、コピー&ペーストを間違えないように祈る…。
PostgreSQLやMongoDBを長年扱ってきた経験から、純粋なスクリプトだけでデータ変換(Transformation)ロジックを管理することは、メンテナンスの観点から大きな間違いだと気づきました。dbt(data build tool)はこの問題を解決するために誕生しました。dbtは、バージョン管理(Git)、テスト、自動ドキュメント生成といったソフトウェアエンジニアリングの思考をデータアナリストの世界に持ち込みます。
Trong mô hình ELT (Extract – Load – Transform)において、dbtは「T」を担います。生データがPostgreSQLに格納された後、dbtはそれらをダッシュボードですぐに使えるクリーンなデータテーブルへと加工します。
dbt CoreのインストールとPostgreSQLへの接続
まず、マシンにPython(3.8以降を推奨)がインストールされている必要があります。dbt Coreは完全に無料で、コマンドライン(CLI)で動作するため非常に軽量です。
1. dbt-postgresライブラリのインストール
汎用的な dbt パッケージではなく、最高のパフォーマンスを得るためにPostgreSQL専用のアダプターをインストールしてください:
pip install dbt-postgres
その後、dbt --version を入力してください。バージョン情報が表示されれば、正しく進んでいます。
2. プロジェクトの初期化
作業ディレクトリでターミナルを開き、以下を実行します:
dbt init my_first_dbt_project
dbtからホスト、ポート、ユーザーなどのパラメータを求められます。不明な場合はそのままEnterを押し、次のステップで詳細を設定しましょう。
profiles.ymlによる安全な接続設定
dbtはデフォルトで接続情報をプロジェクトフォルダ内ではなく、~/.dbt/profiles.yml に保存します。この方法により、情報のセキュリティを最大限に高めることができます。誤ってデータベースのパスワードをGitHubにプッシュしてしまう心配もありません。
以下はローカル環境の標準的な設定例です:
my_first_dbt_project:
outputs:
dev:
type: postgres
threads: 4 # 並列実行するモデル数
host: localhost
port: 5432
user: postgres_user
pass: your_password
dbname: analytics_db
schema: dbt_transformation
target: dev
ヒント: raw(生データ)スキーマと analytics(処理済みデータ)スキーマを分けましょう。このように分離することで、アクセス権限の管理が容易になります。データアナリストには analytics スキーマの参照権限だけを与えれば十分です。
初めてのモデル作成:SELECT文をテーブルに変換する
dbtの世界では、各 .sql ファイルが1つのモデル(Model)となります。面倒な CREATE TABLE や DROP VIEW を書く必要はありません。SELECT 文を書くだけで、残りの重労働はdbtが引き受けてくれます。
例えば、顧客の総支出額を計算するには、models/marts/customer_orders.sql ファイルを作成します:
with orders as (
select * from {{ source('raw', 'orders') }}
),
final as (
select
customer_id,
count(order_id) as total_orders,
sum(amount) as total_spent
from orders
group by 1
)
select * from final
関数 {{ source(...) }} が鍵となります。これにより、dbtは依存関係グラフ(Lineage)を構築します。テーブルAがテーブルBのデータを必要とする場合、dbtは介入なしに自動的にテーブルBを先に実行します。
実行するには、たった一つのコマンド dbt run を入力するだけです。
データ品質のチェック(Data Testing)
データの重複やID列のNullが心配ですか?手動でチェック用スクリプトを書く代わりに、schema.yml ファイルで宣言しましょう。dbtがこの検証を自動化してくれます。
version: 2
models:
- name: customer_orders
columns:
- name: customer_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'returned']
dbt test を実行すると、システムがデータベース全体をスキャンします。違反データが見つかった場合、dbtはすぐに警告を発します。これにより、上司に送るレポートの正確性が常に100%保たれます。
ドキュメントの自動化
すべてのアナリストの恐怖は、カラムの説明がない「見知らぬ」データベースを扱うことです。dbtは、プロフェッショナルなドキュメントサイトを自動生成することで、この問題を根本的に解決します。
2つのコマンドを実行するだけです:
dbt docs generate
dbt docs serve
ウェブインターフェースが表示され、テーブル構造全体とLineage Graph(リネージグラフ)が表示されます。これは、データがどこからどこへ流れるかを視覚化した図です。同僚からロジックについて聞かれたら、リンクを送るだけで済みます。
運用と監視
数百ものモデルを抱えシステムが大きくなると、手動でコマンドを打つのは非効率です。dbtをAirflowやGitHub Actionsなどのスケジューリングツールに統合することをお勧めします。
実行のたびに、dbtは target/ フォルダにJSONファイルを出力します。run_results.json を活用してログをGrafanaに送ることも可能です。これにより、実行時間を監視し、ユーザーから報告を受ける前にエラーを早期発見できます。
最後のアドバイス: すべての古いSQLを1日でdbtに移行しようと急がないでください。まずは最も重要なテーブルから始め、いくつかの基本的なテストを設定しましょう。導入から1〜2週間後には、データ管理の効率が劇的に変わるのを実感できるはずです。

