Snowflake CLI の snow sql コマンドで Jinja テンプレートが使えるようになりました
はじめに
2025年7月に Snowflake CLI の Version 3.10.0 がリリースされました。新機能として Snowlfake CLI で使用できる snow sql コマンドに--enabled_templating
オプションが追加されました。
こちらを試してみましたので、本記事で内容をまとめてみます。
アップデートの概要
snow sql における変数の使用
Snowflake CLI は Snowflake 上の操作を CLI で行うことが出来る開発者向のツールです。特に Snowflake におけるアプリケーション開発(UDF、Streamlit、Snowpark Container Service)におけるこれらのデプロイに関するコマンド群が提供されています。
Snowflake CLI から SQL を発行することも可能で、この際は snow sql を使用します。変数も利用できるので、同じコードを異なる環境や条件で再利用することも可能です。
この際、以下のように<% ... %>
構文を通して変数を渡すことができます。
USE DATABASE test_db;
CREATE OR REPLACE SCHEMA <% var %>_schema;
snow sql で実行
$ snow sql -f var.sql -D "var=dev"
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA dev_schema;
+-----------------------------------------+
| status |
|-----------------------------------------|
| Schema DEV_SCHEMA successfully created. |
+-----------------------------------------+
また、レガシーな方法として以下の構文もサポートとしてます。
USE DATABASE test_db;
CREATE OR REPLACE SCHEMA &{ var }_schema;
リポジトリステージと Jinja2 の使用
上記は snow sql から SQL を実行する際の構文ですが、別の機能として Snowflake ではリポジトリステージという特別な種類のステージを作成することで、GitHub などのリモートリポジトリを Snowflake と統合することができます。
ステージ上のファイルを実行できる EXECUTE IMMEDIATE FROM と組み合わせることで、Snowflake から Git リポジトリのファイルにアクセスし、ファイル内のステートメントを実行することができます。さらに、ここでは Jinja2 を使用でき{{ ... }}
記法によって変数を渡すことが可能です。
これまでは、snow sql
で変数を使用する際に Jinja テンプレートを直接利用することができませんでした。そのため、ローカルで開発した Jinja テンプレートを含む SQL スクリプトを、開発環境などでアドホックに実行するには、リモートリポジトリにプッシュした上で EXECUTE IMMEDIATE FROM
を使って実行する必要がありました。
今回のアップデートで、snow sql
からも Jinja テンプレートを直接指定できるようになりました。具体的には--enable_templating
オプションが追加されているので、こちらを指定します。
これにより、ローカルでのテストやデバッグが容易になり、SQL コードの修正や実行をより素早く行えることが期待できます。
試してみる
事前準備
Gitリポジトリ経由での実行も行うため、Gitリポジトリを作成後、Snowflake との連携設定を行います。ローカルでは検証用のディレクトリを作成し GitHub リポジトリと紐づけておきます。
mkdir sfcli-test && cd $_
echo "# sfclitest" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:<GitHubアカウント名>/<リモートリポジトリ名>.git
git push -u origin main
GitHub 側でトークンを取得し連携設定を行います。
リポジトリステージの作成
--データベース作成
USE ROLE sysadmin;
----シークレット管理用DB・スキーマを作成
CREATE DATABASE IF NOT EXISTS governance;
CREATE SCHEMA IF NOT EXISTS governance.integrations;
--管理用ロールを作成
USE ROLE useradmin;
CREATE ROLE IF NOT EXISTS git_admin;
--スキーマに対するシークレットの作成権限を付与
USE ROLE securityadmin;
GRANT CREATE SECRET ON SCHEMA governance.integrations TO ROLE git_admin;
--対象のデータベース・スキーマに対するUSAGE権限も必要なので付与
GRANT USAGE ON DATABASE governance TO ROLE git_admin;
GRANT USAGE ON SCHEMA governance.integrations TO ROLE git_admin;
--ロール階層を定義
GRANT ROLE git_admin TO ROLE sysadmin;
--コンテキストの設定(シークレット作成ロールに切り替え、スキーマを指定)
USE ROLE git_admin;
USE SCHEMA governance.integrations;
--シークレットを作成
CREATE OR REPLACE SECRET git_secret
TYPE = password
USERNAME = '<ユーザー名>'
PASSWORD = '<トークン>';
--CREATE INTEGRATION 権限を付与
USE ROLE ACCOUNTADMIN;
GRANT CREATE INTEGRATION ON ACCOUNT TO ROLE git_admin;
--API統合を作成
USE ROLE git_admin;
USE SCHEMA governance.integrations;
CREATE OR REPLACE API INTEGRATION git_api_integration
API_PROVIDER = git_https_api
API_ALLOWED_PREFIXES = ('https://github.com/<ユーザー名>')
ALLOWED_AUTHENTICATION_SECRETS = (git_secret)
ENABLED = TRUE;
--CREATE GIT REPOSITORY 権限を付与
USE ROLE securityadmin;
GRANT CREATE GIT REPOSITORY ON SCHEMA governance.integrations TO ROLE git_admin;
--コンテキストの設定
USE ROLE git_admin;
USE SCHEMA governance.integrations;
--GIT REPOSITORY ステージを作成
CREATE OR REPLACE GIT REPOSITORY snowflake_extensions
API_INTEGRATION = git_api_integration
GIT_CREDENTIALS = git_secret
ORIGIN = 'https://github.com/<GitHubアカウント名>/<リモートリポジトリ名>';
ls @snowflake_extensions/branches/main;
こちらの手順は以下をご参照ください。
アップデート前の動作を確認
検証開始時点の Snowflake CLI のバージョンは以下の通りでした。
$ snow --version
Snowflake CLI version: 3.4.1
各構文で SQL ファイルを以下の通り作成しておきました。
- snow sql における現在のデフォルト構文
USE DATABASE test_db;
CREATE OR REPLACE SCHEMA <% var %>_schema;
- snow sql におけるでレガシー構文
USE DATABASE test_db;
CREATE OR REPLACE SCHEMA &{ var }_schema;
- Jinja 記法
USE DATABASE test_db;
CREATE OR REPLACE SCHEMA {{ var }}_schema;
各ファイルをロールから snow sql で実行してみます。この場合、Jinja 記法以外は問題なく動作します。
# snow sql における現在のデフォルト構文
$ snow sql -f var.sql -D "var=dev"
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA dev_schema;
+-----------------------------------------+
| status |
|-----------------------------------------|
| Schema DEV_SCHEMA successfully created. |
+-----------------------------------------+
# snow sql におけるでレガシー構文:警告が出る
$ snow sql -f legacy_var.sql -D "var=dev"
Warning: &{ ... } syntax is deprecated. Use <% ... %> syntax instead.
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA dev_schema;
+-----------------------------------------+
| status |
|-----------------------------------------|
| Schema DEV_SCHEMA successfully created. |
+-----------------------------------------+
# Jinja 記法:エラー
$ snow sql -f jinja.sql -D "var=dev"
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA {{ var }}_schema;
╭─ Error ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 001003 (42000): 01bde50e-0002-9fc1-0002-7916001eaede: SQL compilation error: │
│ syntax error line 1 at position 25 unexpected '{'. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
上記のファイルをリモートリポジトリにプッシュし、リポジトリステージ経由で実行してみます。
この際、Snowflake CLI では以下のコマンドを使用できます。
GitHub 上の変更を Snowflake のリポジトリステージに反映し、確認します。
snow git fetch snowflake_extensions --database governance --schema integrations
$ snow git list-files @snowflake_extensions/branches/main/code --database governance --schema integrations
+-------------------------------------------------------------------------------------------------------------------------------------------------+
| name | size | md5 | sha1 | last_modified |
|--------------------------------------------------------+------+------+------------------------------------------+-------------------------------|
| snowflake_extensions/branches/main/code/jinja.sql | 64 | None | 01ae8c72c87df69e5be35052d154cd5b52c19279 | Thu, 24 Jul 2025 03:56:51 GMT |
| snowflake_extensions/branches/main/code/legacy_var.sql | 63 | None | d5104b732ce2fab3a5f2a5b6e203540b6c8e725a | Thu, 24 Jul 2025 03:56:51 GMT |
| snowflake_extensions/branches/main/code/var.sql | 64 | None | 0f45abdceb2da6e5dabf510b4ba0fe78d1349835 | Thu, 24 Jul 2025 03:56:51 GMT |
+-------------------------------------------------------------------------------------------------------------------------------------------------+
ファイルの実行はsnow git execute
を使用します。var='dev'
としている部分で変数の値を渡しています。この場合、Jinja 記法であれば問題なく動作します。
# snow sql における現在のデフォルト構文:エラー
$ snow git execute @snowflake_extensions/branches/main/code/var.sql -D "var='dev'" --database governance --schema integrations
╭─ Error ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 001003 (42000): 01bde511-0002-a0cb-0002-7916001f098a: Uncaught exception of type 'STATEMENT_ERROR' in file @SNOWFLAKE_CLI_TMP_STAGE_1753329696/code/var.sql: │
│ SQL compilation error: │
│ syntax error line 2 at position 25 unexpected '<'. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
# snow sql におけるでレガシー構文:エラー
$ snow git execute @snowflake_extensions/branches/main/code/legacy_var.sql -D "var='dev'" --database governance --schema integrations
╭─ Error ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 001003 (42000): 01bde512-0002-a0b9-0002-7916001f17de: Uncaught exception of type 'STATEMENT_ERROR' in file @SNOWFLAKE_CLI_TMP_STAGE_1753329740/code/legacy_var.sql: │
│ SQL compilation error: │
│ syntax error line 2 at position 25 unexpected '&'. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
# Jinja 記法
$ snow git execute @snowflake_extensions/branches/main/code/jinja.sql -D "var='dev'" --database governance --schema integrations
SUCCESS - @snowflake_extensions/branches/main/code/jinja.sql
+----------------------------------------------------------------------+
| File | Status | Error |
|----------------------------------------------------+---------+-------|
| @snowflake_extensions/branches/main/code/jinja.sql | SUCCESS | None |
+----------------------------------------------------------------------+
クエリ履歴を確認すると、EXECUTE IMMEDIATE FROM
が実行され、指定の変数が渡されていることを確認できます。
--enable_templating オプションを試す
snow sql における--enable_templating
オプションを試してみます。Version 3.10.0 の機能なので、ここではアップデートから行いました。
前提として、インストール手順は以下の記事が参考になります。
リポジトリから最新版をダウンロードし、インストールします。
# パッケージをリポジトリからダウンロード
wget https://sfc-repo.snowflakecomputing.com/snowflake-cli/linux_x86_64/3.10.0/snowflake-cli-3.10.0.x86_64.deb
# インストール
sudo apt install ./snowflake-cli-3.10.0.x86_64.deb
バージョンを確認
$ snow --version
Snowflake CLI version: 3.10.0
本記事で扱う機能については以下に記載があります。
アップデート後のデフォルトの動作は以下の通りです。
- 標準の構文(
<% ... %>
)- デフォルトで有効
STANDARD
と指定する
- レガシー構文(
&{ ... }
)- デフォルトで有効
LEGACY
と指定する
- Jinja 記法(
{{ ... }}
)- デフォルトで無効
JINJA
と指定する
このため、Jinja記法のファイルは最新版でもデフォルトでは実行時にエラーとなります。
$ snow sql -f jinja.sql -D "var=dev"
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA {{ var }}_schema;
╭─ Error ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 001003 (42000): 01bde521-0002-a172-0002-7916001f276a: SQL compilation error: │
│ syntax error line 1 at position 25 unexpected '{'. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
オプションを明示的に指定し、再度 Jinja テンプレートを指定してみると、問題なく実行できました。
$ snow sql -f jinja.sql -D "var=dev" --enable-templating JINJA
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA dev_schema;
+-----------------------------------------+
| status |
|-----------------------------------------|
| Schema DEV_SCHEMA successfully created. |
+-----------------------------------------+
反対に明示的に--enable-templating JINJA
とすると、標準の構文はエラーとなります。
$ snow sql -f var.sql -D "var=dev" --enable-templating JINJA
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA <% var %>_schema;
╭─ Error ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 001003 (42000): 01bde523-0002-a1af-0002-7916001ece2a: SQL compilation error: │
│ syntax error line 1 at position 25 unexpected '<'. │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
--enable-templating ALL
としてすべての構文を許可することも可能です。
$ snow sql -f var.sql -D "var=dev" --enable-templating ALL
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA dev_schema;
+-----------------------------------------+
| status |
|-----------------------------------------|
| Schema DEV_SCHEMA successfully created. |
+-----------------------------------------+
$ snow sql -f legacy_var.sql -D "var=dev" --enable-templating ALL
Warning: &{ ... } syntax is deprecated and will no longer be supported. Use <% ... %> syntax instead.
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA dev_schema;
+-----------------------------------------+
| status |
|-----------------------------------------|
| Schema DEV_SCHEMA successfully created. |
+-----------------------------------------+
$ snow sql -f jinja.sql -D "var=dev" --enable-templating ALL
USE DATABASE test_db;
+----------------------------------+
| status |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
CREATE OR REPLACE SCHEMA dev_schema;
+-----------------------------------------+
| status |
|-----------------------------------------|
| Schema DEV_SCHEMA successfully created. |
+-----------------------------------------+
ここでは特に触れませんでしたが、プロジェクト定義ファイル(snowflake.yml
)を使用してsnow sql
コマンドで使用できる変数を定義する場合は、標準の構文(<% ... %>
)として扱われます。
さいごに
Snowflake CLI のsnow sql
コマンドに追加された--enabled_templating
オプションを試してみました。リポジトリステージ経由でオブジェクトをデプロイする際、ローカルでの検証を行いやすくなるアップデートと思います。
こちらの内容が何かの参考になれば幸いです。
参考