⛩️
JinjaでSQLを動的生成する
みなさんこんにちは!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