snow sql¶
Snowflake クエリを実行します。クエリ、ファイル名、インプットオプションのいずれかを使用します。実行するクエリは、クエリオプション、ファイル名オプション(ファイルからのすべてのクエリが実行されます)、または他のコマンドからの出力をパイプしてstdin経由で指定できます。例: cat my.sql | snow sql -i
。このコマンドは、クライアント側で行われる変数の置換をサポートします。
構文¶
snow sql
--query <query>
--filename <files>
--stdin
--variable <data_override>
--retain-comments
--single-transaction / --no-single-transaction
--project <project_definition>
--env <env_overrides>
--connection <connection>
--host <host>
--port <port>
--account <account>
--user <user>
--password <password>
--authenticator <authenticator>
--private-key-file <private_key_file>
--token-file-path <token_file_path>
--database <database>
--schema <schema>
--role <role>
--warehouse <warehouse>
--temporary-connection
--mfa-passcode <mfa_passcode>
--enable-diag
--diag-log-path <diag_log_path>
--diag-allowlist-path <diag_allowlist_path>
--oauth-client-id <oauth_client_id>
--oauth-client-secret <oauth_client_secret>
--oauth-authorization-url <oauth_authorization_url>
--oauth-token-request-url <oauth_token_request_url>
--oauth-redirect-uri <oauth_redirect_uri>
--oauth-scope <oauth_scope>
--oauth-disable-pkce
--oauth-enable-refresh-tokens
--oauth-enable-single-use-refresh-tokens
--client-store-temporary-credential
--format <format>
--verbose
--debug
--silent
--enhanced-exit-codes
引数¶
なし
オプション¶
--query, -q TEXT
実行するクエリ。
--filename, -f FILE
実行するファイル。デフォルト: []
--stdin, -i
標準入力からクエリを読み取ります。このコマンドに入力をパイプするときに使用します。デフォルト: false。
--variable, -D TEXT
key=value形式の文字列。提供された場合、 SQL コンテンツはテンプレートとして扱われ、提供されたデータを使用してレンダリングされます。
--retain-comments
Snowflakeに渡されたクエリのコメントを保持します。デフォルト: false。
--single-transaction / --no-single-transaction
自動コミットを無効にして接続します。ステートメントを BEGIN/COMMIT で囲んで単一のトランザクションとして実行し、すべてのコマンドを正常に完了するか、変更が適用されないようにします。デフォルト: false。
-p, --project TEXT
Snowflakeプロジェクトが保存されているパス。デフォルトは現在の作業ディレクトリです。
--env TEXT
key=value の形式の文字列。テンプレートに使用されたenvセクションの変数を上書きします。デフォルト: []
--connection, -c, --environment TEXT
config.toml
ファイルで定義されている接続の名前。デフォルト:デフォルト
--host TEXT
接続用のホストアドレス。接続に指定された値を上書きします。
--port INTEGER
接続のポート。接続に指定された値を上書きします。
--account, --accountname TEXT
Snowflakeアカウントに割り当てられた名前。接続に指定された値を上書きします。
--user, --username TEXT
Snowflakeに接続するユーザー名。接続に指定された値を上書きします。
--password TEXT
Snowflakeのパスワード。接続に指定された値を上書きします。
--authenticator TEXT
Snowflakeの認証コード。接続に指定された値を上書きします。
--private-key-file, --private-key-path TEXT
Snowflake プライベートキーファイルへのパス。接続に指定された値を上書きします。
--token-file-path TEXT
Snowflake接続時に使用する OAuth トークンを含むファイルへのパス。
--database, --dbname TEXT
使用するデータベース。接続に指定された値を上書きします。
--schema, --schemaname TEXT
使用するデータベーススキーマ。接続に指定された値を上書きします。
--role, --rolename TEXT
使用するロール。接続に指定された値を上書きします。
--warehouse TEXT
使用するウェアハウス名。接続に指定された値を上書きします。
--temporary-connection, -x
config で定義された接続ではなく、コマンドラインパラメーターで定義された接続を使用します。デフォルト: false。
--mfa-passcode TEXT
多要素認証(MFA)に使用するトークン。
--enable-diag
接続診断レポートを作成するかどうか。デフォルト: false。
--diag-log-path TEXT
生成されたレポートのパス。デフォルトはシステム仮ディレクトリです。デフォルト: <system_temporary_directory>.
--diag-allowlist-path TEXT
allowlist パラメーターを含む JSON ファイルへのパス。
--oauth-client-id TEXT
Snowflake統合のためにIDプロバイダーが提供するクライアントIDの値。
--oauth-client-secret TEXT
Snowflake 統合用に ID プロバイダーが提供するクライアントシークレットの値。
--oauth-authorization-url TEXT
認証コードをドライバーに提供する ID プロバイダーエンドポイント。
--oauth-token-request-url TEXT
ドライバーにアクセストークンを供給する ID プロバイダーのエンドポイント。
--oauth-redirect-uri TEXT
URI 認証コードのリダイレクトに使用します。
--oauth-scope TEXT
ID プロバイダー承認リクエストで要求された範囲。
--oauth-disable-pkce
コード交換の証明キー (PKCE) を無効にします。デフォルト:
False
。--oauth-enable-refresh-tokens
実際のアクセストークンが古くなった場合に、サイレント再認証コードを有効にします。デフォルト:
False
。--oauth-enable-single-use-refresh-tokens
シングルユース・更新・トークンのセマンティクスにオプトインするかどうか。デフォルト:
False
。--client-store-temporary-credential
仮認証情報を保存します。
--format [TABLE|JSON]
出力形式を指定します。デフォルト: TABLE
--verbose, -v
ログレベル
info
以上のログエントリを表示します。デフォルト: false。--debug
ログレベル
debug
以上のログ エントリを表示します。デバッグログには追加情報が含まれます。デフォルト: false。--silent
コンソールへの中間出力をオフにします。デフォルト: false。
--enhanced-exit-codes
終了エラーコードをエラーのタイプによって区別します。デフォルト: false。
--help
このコマンドのヘルプテキストを表示します。
使用上の注意¶
実行する SQL クエリを、次のオプションのいずれかを使用して指定できます。
--query
オプションを使用してクエリ文字列を指定します。SQL クエリを含む1つ以上のファイルを実行するには、
--filename
オプションを使用します。例:snow sql -f myfile.sql
snow sql -f file1.sql -f file2.sql
クエリを
stdin
として指定し、snow sql
コマンドにパイプします。例えばcat my.sql | snow sql
です。SYSTEM 関数 のドル記号など、クエリにシェルに解釈させたくない特殊文字が含まれている場合は、次のいずれかを実行できます。
次のように、クエリを二重引用符ではなく一重引用符で囲みます。
snow sql -q 'SELECT SYSTEM$CLIENT_VERSION_INFO()'
次のように特殊文字をエスケープします。
snow sql -q "SELECT SYSTEM\$CLIENT_VERSION_INFO()"
SQL クエリをテンプレート化するために、 SQL クエリの
<% variable_name %>
プレースホルダーと-D
コマンドラインオプションを組み合わせた変数を次の形式で使用します。snow sql -q "select * from my-database order by <% column_name %>" -D "column_name=Country"
注釈
現在、テンプレートには SnowSQL
&variable_name
と<% variable_name %>
の構文を使うことができます。ただし、Snowflakeでは<% variable_name %>
構文の使用を推奨しています。クエリでスクリプトブロックを指定します。例:
EXECUTE IMMEDIATE $$ -- Snowflake Scripting code DECLARE radius_of_circle FLOAT; area_of_circle FLOAT; BEGIN radius_of_circle := 3; area_of_circle := pi() * radius_of_circle * radius_of_circle; RETURN area_of_circle; END; $$ ;
注釈
スクリプトブロックを Snowflake CLI コマンドラインで直接指定する場合、シェルによっては
$$
という区切り文字が別のものとして解釈されるため、動作しないことがあります。たとえば、bashシェルやzshシェルは、これをプロセス ID (PID)として解釈します。この制限に対処するために、次のような選択肢を使うことができます。それでもコマンドラインでスクリプトブロックを指定する場合は、
$$
区切り文字をエスケープして、\$\$
のようにすることができます。デフォルトの
$$
区切り文字のスクリプトブロックを別のファイルに置き、snow sql -f <filename>
コマンドで呼び出すこともできます。
エラーコードの強化¶
--enhanced-exit-codes
オプションは、クエリの実行結果による問題か、無効なコマンド・オプションによる問題かを識別するのに役立つ情報を提供します。このオプションを指定すると、 snow sql
コマンドは以下のリターンコードを提供します。
0
: 実行成功2
: コマンドパラメーターの問題5
: クエリ実行の問題1
: その他のタイプ
コマンド実行後、 echo $?
シェルコマンドでリターンコードを確認できます。
この例では、コマンドはクエリパラメーター(-q 'select 1'
)とクエリファイルパラメーター(-f my.query
)の両方を含んでおり、これは無効なパラメーターの組み合わせです。
snow sql --enhanced-exit-codes -q 'select 1' -f my.query
echo $?
2
次の例は、コマンドに無効なクエリ(slectのスペルが間違っている)が含まれている場合の --enhanced-exit-codes
オプションの効果を示しています。
--enhanced-exit-codes
オプションを付けると、コマンドはクエリエラーを示す5
終了コードを返します。snow sql --enhanced-exit-codes -q 'slect 1' echo $?
5
--enhanced-exit-codes
オプションを指定しないと、コマンドは一般的な(その他の)エラーを示す1
終了コードを返します。snow sql --enhanced-exit-codes -q 'slect 1' echo $?
1
あるいは、 SNOWFLAKE_ENHANCED_EXIT_CODES
環境変数を 1
に設定して、すべての snow sql
コマンドの拡張リターンコードを送信することもできます。
インタラクティブモード¶
snow sql
コマンドは、 SQL コマンドを一度に入力できるインタラクティブモードをサポートしています。インタラクティブモードには以下の機能があります。
構文の強調表示
タイプ中のコード補完
検索可能な履歴
コマンド履歴を検索するには、CTRL-R を押します。
マルチライン入力
セミコロンで終わっていない行(
;
)で ENTER を押すと、ステートメントがセミコロンで終わるまで、カーソルは次の行に移動してコマンドを続けます。
インタラクティブモードを使用するには、以下のように、 snow sql
コマンドに続いて、 ENTER を入力します。
snow sql
このコマンドは、 >
プロンプトのあるサブシェルを開き、 SQL コマンドを対話的に入力できます。
$ snow sql
╭───────────────────────────────────────────────────────────────────────────────────╮
│ Welcome to Snowflake-CLI REPL │
│ Type 'exit' or 'quit' to leave │
╰───────────────────────────────────────────────────────────────────────────────────╯
>
以下のように、 SQL コマンドを入力します。
> create table my_table (c1 int);
+-------------------------------------+
| status |
|-------------------------------------|
| Table MY_TABLE successfully created.|
+-------------------------------------+
注釈
各 SQL ステートメントをセミコロン(;
)で終わらせる必要があります。
インタラクティブモードを終了するには、 exit
、 quit
、または CTRL-D と入力します。
1トランザクションで複数のコマンドを実行可能¶
--single-transaction
オプションを使用すると、複数の SQL コマンドを入力し、オールオアナッシングのコマンドセットとして実行することができます。コマンドを単一のトランザクションで実行することで、変更をコミットする前にすべてのコマンドが正常に完了することを確認できます。コマンドのどれかが失敗した場合、成功したコマンドからの変更はどれも持続しません。
以下の例は、成功したトランザクションと失敗したトランザクションを示しています。
コマンド実行成功
snow sql -q "insert into my_tbl values (123); insert into my_tbl values (124);" --single-transaction
BEGIN; +----------------------------------+ | status | |----------------------------------| | Statement executed successfully. | +----------------------------------+ insert into my_tbl values (123); +-------------------------+ | number of rows inserted | |-------------------------| | 1 | +-------------------------+ insert into my_tbl values (124); +-------------------------+ | number of rows inserted | |-------------------------| | 1 | +-------------------------+ COMMIT +----------------------------------+ | status | |----------------------------------| | Statement executed successfully. | +----------------------------------+
その後、コマンドがデータベースにコミットされたことを確認できます。
snow sql -q "select count(*) from my_tbl"
select count(*) from my_tbl +----------+ | COUNT(*) | |----------| | 2 | +----------+
単一トランザクションの失敗
snow sql -q "insert into my_tbl values (123); insert into my_tbl values (124); select BAD;" --single-transaction
BEGIN; +----------------------------------+ | status | |----------------------------------| | Statement executed successfully. | +----------------------------------+ insert into my_tbl values (123); +-------------------------+ | number of rows inserted | |-------------------------| | 1 | +-------------------------+ insert into my_tbl values (124); +-------------------------+ | number of rows inserted | |-------------------------| | 1 | +-------------------------+ select BAD; ╭─ Error ───────────────────────────────────────────────────────────────────────────────╮ │ 000904 (42000): 01bc3b84-0810-0247-0001-c1be14ee11ce: SQL compilation error: error │ │ line 1 at position 7 │ │ invalid identifier 'BAD' │ ╰───────────────────────────────────────────────────────────────────────────────────────╯
その後、コマンドがデータベースにコミットされていないことを確認できます。
snow sql -q "select count(*) from my_tbl"select count(*) from my_tbl +----------+ | COUNT(*) | |----------| | 0 | +----------+
例¶
以下の例では、 SQL SYSTEM$CLIENT_VERSION_INFO システム関数を使用して、クライアントとドライバーのバージョン情報を返します。
snow sql --query 'SELECT SYSTEM$CLIENT_VERSION_INFO();'
select current_version(); +-------------------+ | CURRENT_VERSION() | |-------------------| | 8.25.1 | +-------------------+
次の例は、クライアント側の変数を使用してデータベースを指定する方法を示しています。
snow sql -q "select * from <% database %>.logs" -D "database=dev"
実行されると、コマンドは
<% database %>
変数の値をdev
に置き換えてdev.logs
識別子を作成し、select * from dev.logs
SQL クエリをSnowflakeに送信して処理します。注釈
現在、テンプレートには SnowSQL
&variable_name
構文を使用できます。ただし、Snowflakeでは<% variable_name %>
構文の使用を推奨しています。この例では、
--env
オプションを使って環境変数を渡す方法を示しています。snow sql -q "select '<% ctx.env.test %>'" --env test=value_from_cli
デフォルトでは、 Snowflake CLI は SQL クエリのコメントを出力から削除します。以下の例では、クエリ結果にコメントを含めるために
--retain-comments
オプションを使用しています。example.sql
ファイルに以下のステートメントとコメントが含まれていると仮定します。select 'column1'; -- My comment select 'column2';
以下のコマンドを実行すると、クエリ結果に
--My comment
が表示されます。snow sql -f example.sql --retain-comments
select 'column1'; +-----------+ | 'COLUMN1' | |-----------| | ABC | +-----------+ -- My comment select 'bar'; +-----------+ | 'COLUMN2' | |-----------| | 123 | +-----------+