⛩️

JinjaでSQLを動的生成する

2024/02/02に公開

みなさんこんにちは!kirigayaです。
みなさんJinja使ってますか?
どうでもいい話ですが最初は神社とは知らずジンジャーと呼んでいました。

今回はpythonコードの中で柔軟にSQLを生成する記事です。
動的生成のイメージとしてはクエリの中に変数を埋め込んで変数を変えるだけで
クエリの内容を変える感じです。
使える場面としては決まったクエリ内でフィルター条件だけ変えたいと言った場面です。

環境はColabノートブックを使います。
DBはdukdbを使います。ノートブック上にすぐ構築できて色々便利です。
1セルずつ実行していきましょう。

初期セットアップ

!pip install -q jupysql duckdb-engine

# データのダウンロード
!wget https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv
%load_ext sql

# インメモリのDBに接続する
%sql duckdb://

csvファイルを指定して直接クエリできます。外部テーブルみたいですね。

%%sql
SELECT
  *
FROM
  penguins.csv
LIMIT 5;
print(_)

テンプレートを作成してみる

from jinja2 import Template

# テンプレートを作成
sql_template = Template("""
SELECT
  {{ columns }}
FROM
  penguins.csv
LIMIT 5;
""")

# カラムを指定
selected_columns = "island"

# テンプレートから動的生成
sql_query = sql_template.render(columns=selected_columns)

# クエリを確認
print(sql_query)

結果を見てみる

%%sql
{{sql_query}}

正しいクエリが生成されていることが確認できます。
次のステップとしては...
クエリ管理とかdbtと組み合わせたりとか色々できそうです。

岩田組

Discussion