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
--enable-templating <enabled_templating>
--project <project_definition>
--env <env_overrides>
--connection <connection>
--host <host>
--port <port>
--account <account>
--user <user>
--password <password>
--authenticator <authenticator>
--workload-identity-provider <workload_identity_provider>
--private-key-file <private_key_file>
--token <token>
--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 TEXTkey=value 格式的字符串。如果提供,SQL 内容将被视为模板并使用所提供的数据渲染。
--retain-comments保留传递给 Snowflake 的查询中的注释。默认值:False。
--single-transaction / --no-single-transaction连接时禁用自动提交。将语句放入 BEGIN/COMMIT 内可将语句作为单个事务执行,并确保所有命令成功完成或不应用更改。默认值:False。
--enable-templating [LEGACY|STANDARD|JINJA|ALL|NONE]在将查询传递给 Snowflake 之前用于解析变量的语法。默认值:[<_EnabledTemplating.LEGACY: 'LEGACY'>, <_EnabledTemplating.STANDARD: 'STANDARD'>]。
-p, --project TEXTSnowflake 项目的存储路径。默认为当前工作目录。
--env TEXT格式为 key=value 的字符串。替换用于模板的 env 部分的变量。默认值:[]。
--connection, -c, --environment TEXT连接名称,如您在
config.toml文件中所定义。默认值:default。--host TEXT连接的主机地址。替换为连接指定的值。
--port INTEGER连接的端口。替换为连接指定的值。
--account, --accountname TEXT分配给 Snowflake 账户的名称。替换为连接指定的值。
--user, --username TEXT连接到 Snowflake 的用户名。替换为连接指定的值。
--password TEXTSnowflake 密码。替换为连接指定的值。
--authenticator TEXTSnowflake 身份验证器。替换为连接指定的值。
--workload-identity-provider TEXTWorkload identity provider (AWS, AZURE, GCP, OIDC). Overrides the value specified for the connection.
--private-key-file, --private-key-path TEXTSnowflake 私钥文件路径。替换为连接指定的值。
--token TEXT连接到 Snowflake 时使用的 OAuth 令牌。
--token-file-path TEXT连接到 Snowflake 时使用的带有 OAuth 令牌的文件路径。
--database, --dbname TEXT要使用的数据库。替换为连接指定的值。
--schema, --schemaname TEXT要使用的数据库架构。替换为连接指定的值。
--role, --rolename TEXT要使用的角色。替换为连接指定的值。
--warehouse TEXT要使用的仓库。替换为连接指定的值。
--temporary-connection, -x使用命令行参数定义的连接,而不是在配置中定义的连接。默认值:False。
--mfa-passcode TEXT用于多重身份验证的令牌 (MFA)。
--enable-diag是否生成连接诊断报告。默认值:False。
--diag-log-path TEXT生成的报告的路径。默认为系统临时目录。默认:<system_temporary_directory>。
--diag-allowlist-path TEXT包含允许列表参数的 JSON 文件的路径。
--oauth-client-id TEXT身份提供商为 Snowflake 集成提供的客户端 ID 的值。
--oauth-client-secret TEXT身份提供商为 Snowflake 集成提供的客户端密钥的值。
--oauth-authorization-url TEXT向驱动程序提供授权码的身份提供商端点。
--oauth-token-request-url TEXT向驱动程序提供访问令牌的身份提供商端点。
--oauth-redirect-uri TEXTURI 用于授权码重定向。
--oauth-scope TEXT身份提供商授权请求中请求的范围。
--oauth-disable-pkce禁用代码交换证明密钥 (PKCE)。默认值:
False。--oauth-enable-refresh-tokens在实际访问令牌过期时启用静默重新身份验证。默认值:
False。--oauth-enable-single-use-refresh-tokens是否选择启用一次性刷新令牌语义。默认值:
False。--client-store-temporary-credential存储临时凭据。
--format [TABLE|JSON|JSON_EXT|CSV]指定输出格式。默认:TABLE。
--verbose, -v显示日志级别
info及更高级别的日志条目。默认值:False。--debug显示日志级别
debug及更高级别的日志条目;调试日志包含其他信息。默认值:False。--silent关闭到控制台的中间输出。默认值:False。
--enhanced-exit-codes根据错误类型区分退出错误代码。默认值:False。
--help显示此命令的帮助文本。
使用说明¶
您可以使用以下选项之一指定要执行的 SQL 查询:
使用
--query选项指定查询字符串。使用
--filename选项执行一个或多个包含 SQL 查询的文件。例如:snow sql -f myfile.sqlsnow sql -f file1.sql -f file2.sql
将查询指定为
stdin,并通过管道将其传送到snow sql命令,如cat my.sql | snow sql。如果您的查询包含不希望 shell 解释的特殊字符,例如 SYSTEM 函数 中的美元符号,则可以执行以下任一操作:
将查询放到单引号而不是双引号里,如:
snow sql -q 'SELECT SYSTEM$CLIENT_VERSION_INFO()'转义特殊字符,如:
snow sql -q "SELECT SYSTEM\$CLIENT_VERSION_INFO()"
使用和
<% variable_name %>placeholder in your SQL queries and a-D命令行选项组合的变量来模板化 SQL 查询,格式为: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 命令行上直接指定脚本块时,
$$分隔符可能在某些 shell 中无法正常运行,因为它们会将该分隔符解释为其他内容。例如,bash 和 zsh shell 会将其解释为过程 ID (PID)。为解决此限制,您可以使用以下替代方案:如果您仍然想在命令行上指定脚本块,可以转义
$$分隔符,如\$\$中所示。您还可以将带有默认
$$分隔符的脚本块放入单独的文件中,并使用snow sql -f <filename>命令进行调用。
设置 JSON 输出格式¶
--format 选项提供两种 JSON 显示方式:
JSON:以带引号的字符串形式返回 JSON,类似如下:snow sql --format json -q "SELECT PARSE_JSON('{"name": "Alice", "age": 30}') as json_col"
[ { "JSON_COL": "{\"name\": \"Alice\", \"age\": 30}" } ]
JSON_EXT:以 JSON 对象的形式返回 JSON,类似如下:snow sql --format JSON_EXT -q "SELECT PARSE_JSON('{"name": "Alice", "age": 30}') as json_col"
[ { "JSON_COL": { "name": "Alice", "age": 30 } ]
增强的错误代码¶
--enhanced-exit-codes 选项提供的信息有助于识别问题是由查询执行还是由无效的命令选项引起的。使用此选项,snow sql 命令提供以下返回代码:
0:执行成功2:命令参数问题5:查询执行问题1:其他类型的问题
命令执行后,您可以使用:codenowrap:echo $? shell 命令来查看返回代码。
在此示例中,该命令同时包含查询参数 (-q 'select 1') 和查询文件参数 (-f my.query),后者是无效的参数组合:
snow sql --enhanced-exit-codes -q 'select 1' -f my.query
echo $?
2
以下示例显示了当命令包含无效查询(选择拼写错误)时 --enhanced-exit-codes 选项的效果:
在使用
--enhanced-exit-codes选项的情况下,该命令会返回5退出代码以表示查询错误:snow sql --enhanced-exit-codes -q 'slect 1' echo $?
5在不使用:codenowrap:
--enhanced-exit-codes ` 选项的情况下,该命令会返回 :codenowrap:`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
该命令会打开一个带有 > 提示符的子 shell,您可以在其中交互式地输入 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。
在单个事务中使用多个命令¶
--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.logsSQL 查询发送到 Snowflake 进行处理。备注
您当前可以使用 SnowSQL
&variable_name和 &``{ 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 | +-----------+