Snowflake: Snowsqlの出力結果フォーマットは(snowsqlコマンド実行時の)output_formatパラメータで指定・変更可能です

2020.10.15

タイトルで言いたいことを言い切った感がありますが、そうなんです。この件でちょっと困っていたんです。

困っていたというか、まぁ『これが解決出来なければ死ぬ』って程では無いですが、もうちょっと便利な方法ないかなーと。

というのも、ちょうど下記のエントリを書くにあたってSnowsqlで色々結果を表示させていた時に、結果の列数が多いと表示されている内容が表形式ではあるものの(スクリーン表示サイズの問題もあり)だいぶガタガタする感じになってしまっていたので、何か良い感じに出力方式を切り替えられないかな、というのが発端でした。

例えば、Amazon Redshiftにおける以下のような方法等です。

当エントリでは、Snowflake(Snowsql)でも出力形式を切り替えられるよ!という内容を紹介したいと思います。

目次

 

どこを切り替えれば対応出来るのか

SnowsqlにおけるSQL実行結果の出力形式の変更は、SnowSQL 構成オプションの1つである『output_format』を使う事で行なえます。

 

通常(デフォルト)クエリを実行した場合の出力結果

通常、特に何も出力結果部分の指定を行わなかった時のデフォルトの挙動は以下のような書式となります。設定値的にはoutput_format=psqlが指定されている形となるようです。

saiki_akari#MESOKO_WH_X_SMALL@MESOKO_DB.(no schema)>
SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id;
+---------+-----------+------------+                                            
| USER_ID | USER_NAME | BIRTHDAY   |
|---------+-----------+------------|
|     111 | AAAA      | 2020-10-14 |
|     222 | BBBB      | 2020-10-14 |
|     444 | ZZZZ      | 2020-10-14 |
|     555 | EEEE      | 2020-10-14 |
+---------+-----------+------------+
4 Row(s) produced. Time Elapsed: 0.142s

なお、環境やデータは下記エントリを書いた時に作ったものを活用しました。

 

指定パラメータ別 出力結果サンプル

以降のセクションでは、それぞれパラメータを指定してクエリを実行してみるとどのような結果が得られるかを実際に試してみた結果を列挙しています。手間を省くためにsnowsql実行時のパラメータに(-qパラメータを使って)クエリ内容も含める形で実行しています。

 

「csv」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=csv
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

"USER_ID","USER_NAME","BIRTHDAY"                                                
"111","AAAA","2020-10-14"
"222","BBBB","2020-10-14"
"444","ZZZZ","2020-10-14"
"555","EEEE","2020-10-14"
4 Row(s) produced. Time Elapsed: 0.083s
Goodbye!

 

「expanded」の場合

% snowsql \                                                                                                                
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=expanded
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

***************************[ 1 ]***************************                     
USER_ID   | 111
USER_NAME | AAAA
BIRTHDAY  | 2020-10-14
***************************[ 2 ]***************************
USER_ID   | 222
USER_NAME | BBBB
BIRTHDAY  | 2020-10-14
***************************[ 3 ]***************************
USER_ID   | 444
USER_NAME | ZZZZ
BIRTHDAY  | 2020-10-14
***************************[ 4 ]***************************
USER_ID   | 555
USER_NAME | EEEE
BIRTHDAY  | 2020-10-14

4 Row(s) produced. Time Elapsed: 0.143s
Goodbye!

 

「fancy_grid」の場合

 % snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=fancy_grid
Password: 
❄ SnowSQL ❄ v1.2.10
Type SQL statements or !help

╒═════════╤═══════════╤════════════╕                                            
│ USER_ID │ USER_NAME │ BIRTHDAY   │
╞═════════╪═══════════╪════════════╡
│     111 │ AAAA      │ 2020-10-14 │
├─────────┼───────────┼────────────┤
│     222 │ BBBB      │ 2020-10-14 │
├─────────┼───────────┼────────────┤
│     444 │ ZZZZ      │ 2020-10-14 │
├─────────┼───────────┼────────────┤
│     555 │ EEEE      │ 2020-10-14 │
╘═════════╧═══════════╧════════════╛
4 Row(s) produced. Time Elapsed: 1.487s
Goodbye!

 

「grid」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=grid     
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

+---------+-----------+------------+                                            
| USER_ID | USER_NAME | BIRTHDAY   |
+=========+===========+============+
|     111 | AAAA      | 2020-10-14 |
+---------+-----------+------------+
|     222 | BBBB      | 2020-10-14 |
+---------+-----------+------------+
|     444 | ZZZZ      | 2020-10-14 |
+---------+-----------+------------+
|     555 | EEEE      | 2020-10-14 |
+---------+-----------+------------+
4 Row(s) produced. Time Elapsed: 0.292s
Goodbye!

 

「html」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=html
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

<table>                                                                         
<tr><th style="text-align: right;">USER_ID</th><th>USER_NAME</th><th>BIRTHDAY  </th></tr>
<tr><td style="text-align: right;">    111</td><td>AAAA     </td><td>2020-10-14</td></tr>
<tr><td style="text-align: right;">    222</td><td>BBBB     </td><td>2020-10-14</td></tr>
<tr><td style="text-align: right;">    444</td><td>ZZZZ     </td><td>2020-10-14</td></tr>
<tr><td style="text-align: right;">    555</td><td>EEEE     </td><td>2020-10-14</td></tr>
</table>
4 Row(s) produced. Time Elapsed: 0.125s
Goodbye!

 

「json」の場合

※都合上改行して表示させていますが実際は改行無しの1行で出力されています。

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=json
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

[
{"USER_ID": "111", "USER_NAME": "AAAA", "BIRTHDAY": "2020-10-14"},
{"USER_ID": "222", "USER_NAME": "BBBB", "BIRTHDAY": "2020-10-14"},
{"USER_ID": "444", "USER_NAME": "ZZZZ", "BIRTHDAY": "2020-10-14"},
{"USER_ID": "555", "USER_NAME": "EEEE", "BIRTHDAY": "2020-10-14"}
]
4 Row(s) produced. Time Elapsed: 0.117s
Goodbye!

 

「latex」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=latex
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

\begin{tabular}{rll}                                                            
\hline
 USER\_ID & USER\_NAME & BIRTHDAY   \\
\hline
     111 & AAAA      & 2020-10-14 \\
     222 & BBBB      & 2020-10-14 \\
     444 & ZZZZ      & 2020-10-14 \\
     555 & EEEE      & 2020-10-14 \\
\hline
\end{tabular}
4 Row(s) produced. Time Elapsed: 0.095s
Goodbye!

 

「latex_booktabs」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=latex_booktabs
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

\begin{tabular}{rll}                                                            
\toprule
 USER\_ID & USER\_NAME & BIRTHDAY   \\
\midrule
     111 & AAAA      & 2020-10-14 \\
     222 & BBBB      & 2020-10-14 \\
     444 & ZZZZ      & 2020-10-14 \\
     555 & EEEE      & 2020-10-14 \\
\bottomrule
\end{tabular}
4 Row(s) produced. Time Elapsed: 0.122s
Goodbye!

 

「mediawiki」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=mediawiki    
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

{| class="wikitable" style="text-align: left;"                                  
|+ <!-- caption -->
|-
! align="right"| USER_ID !! USER_NAME !! BIRTHDAY  
|-
| align="right"|     111 || AAAA      || 2020-10-14
|-
| align="right"|     222 || BBBB      || 2020-10-14
|-
| align="right"|     444 || ZZZZ      || 2020-10-14
|-
| align="right"|     555 || EEEE      || 2020-10-14
|}
4 Row(s) produced. Time Elapsed: 0.097s
Goodbye!

 

「orgtbl」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=orgtbl  
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help
| USER_ID | USER_NAME | BIRTHDAY   |                                            
|---------+-----------+------------|
|     111 | AAAA      | 2020-10-14 |
|     222 | BBBB      | 2020-10-14 |
|     444 | ZZZZ      | 2020-10-14 |
|     555 | EEEE      | 2020-10-14 |
4 Row(s) produced. Time Elapsed: 0.079s
Goodbye!

 

「pipe」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=pipe 
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

| USER_ID | USER_NAME | BIRTHDAY   |                                            
|--------:|:----------|:-----------|
|     111 | AAAA      | 2020-10-14 |
|     222 | BBBB      | 2020-10-14 |
|     444 | ZZZZ      | 2020-10-14 |
|     555 | EEEE      | 2020-10-14 |
4 Row(s) produced. Time Elapsed: 0.093s
Goodbye!

 

「plain」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=plain
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

USER_ID  USER_NAME  BIRTHDAY                                                    
    111  AAAA       2020-10-14
    222  BBBB       2020-10-14
    444  ZZZZ       2020-10-14
    555  EEEE       2020-10-14
4 Row(s) produced. Time Elapsed: 0.121s
Goodbye!

 

「psql」の場合

指定無しの場合のデフォルト表示形式。

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=psql
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

+---------+-----------+------------+                                            
| USER_ID | USER_NAME | BIRTHDAY   |
|---------+-----------+------------|
|     111 | AAAA      | 2020-10-14 |
|     222 | BBBB      | 2020-10-14 |
|     444 | ZZZZ      | 2020-10-14 |
|     555 | EEEE      | 2020-10-14 |
+---------+-----------+------------+
4 Row(s) produced. Time Elapsed: 0.098s
Goodbye!

 

「rst」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=rst
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

=======  =========  ==========                                                  
USER_ID  USER_NAME  BIRTHDAY  
=======  =========  ==========
    111  AAAA       2020-10-14
    222  BBBB       2020-10-14
    444  ZZZZ       2020-10-14
    555  EEEE       2020-10-14
=======  =========  ==========
4 Row(s) produced. Time Elapsed: 0.113s
Goodbye!

 

「simple」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=simple
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

USER_ID  USER_NAME  BIRTHDAY                                                    
-------  ---------  ----------
    111  AAAA       2020-10-14
    222  BBBB       2020-10-14
    444  ZZZZ       2020-10-14
    555  EEEE       2020-10-14
4 Row(s) produced. Time Elapsed: 0.361s
Goodbye!

 

「tsv」の場合

% snowsql \
  -a xxxxxxxxxxxxxxxxxx.ap-northeast-1.aws \
  -u saiki_akari \
  -w MESOKO_WH_X_SMALL -r MESOKO_DB_ADMIN_ROLE -d MESOKO_DB -s PUBLIC \
  -q "SELECT user_id, user_name, birthday FROM public.tabletest ORDER BY user_id" \
  -o output_format=tsv  
Password: 
* SnowSQL * v1.2.10
Type SQL statements or !help

USER_ID USER_NAME       BIRTHDAY                                                
111	AAAA	2020-10-14
222	BBBB	2020-10-14
444	ZZZZ	2020-10-14
555	EEEE	2020-10-14
4 Row(s) produced. Time Elapsed: 0.137s
Goodbye!

 

まとめ

という訳で、Snowsqlの出力形式をパラメータで切り替えられるよ、という内容の紹介でした。

調べてみると意外と色々パターンが対応されていたんですね。個人的にはexpandedで列内容を横に並べるんじゃなくて縦に並べられるのが便利で良いかなと思いました。状況や用途に応じて使い分けていきたいと思います。