【Snowflake】SnowSQLでネイティブアプリの開発環境を試行錯誤した感想

【Snowflake】SnowSQLでネイティブアプリの開発環境を試行錯誤した感想 | Tableau-id Press -タブロイド-
snowflake_logo

こんにちは! t.ozawaです。

今回のブログは、ネイティブアプリの開発環境をSnowSQLを利用して構築した試行錯誤と、現状の問題点を共有します。

 

Snowsightでのネイティブアプリの開発では、

アプリパッケージを作成(Worksheets)

⇒アプリパッケージのステージに設定ファイルをPUT(Data⇒Databases)

⇒アプリパッケージのバージョンを作成(Worksheets)

⇒アプリパッケージの共有設定(Data⇒Provider Studio)

のように、ワークシートページとデータページを行き来するので、作成がやや面倒くさいです。

開発を少しでもスムーズに行いたいため、画面遷移のない開発環境を整えたいと考えました。

そこで考えたのがSnowSQLでの開発です。

SnowSQL上でのネイティブアプリ開発手順

方策

複数のクエリを一つのSQLファイルに格納して、それをSnowSQLで一斉実行する

1. SnowSQLを整備

SnowSQLのインストーラーをダウンロードし、ローカルPCの環境にSnowSQLをインストールしていきます。

自身のPCに対応するOSのインストーラーをインストールします。

インストーラー実行後、以下のコマンドを打って応答が返ってきたら、環境構築成功です。

snowsql -v //SnowSQLのバージョンを表示

// Version: 1.2.27 <-成功! 

2. master.sqlにアプリを作成するためのクエリを記述

ネイティブアプリを構築するための一連のクエリを、ローカルパスに格納された「master.sql」に格納していきます。

tipsとして、普段ワークシート上で実行するSQL文と、ステージで扱うPUTやCOPY構文は、SnowSQLでは同列として扱うことができます。

したがって、ひとつのsqlファイルの中にまとめることができ、SnowSQL上で一斉に実行できます。

これがワークシート上との差別点になります。

 

master.sqlを作成した例として、sqlファイルの中身を示します。

//C:\Users\username\desktop\master.sqlに作成
///////////////////////////
//Ⅰ. アプリパッケージを作成//
///////////////////////////
//パッケージを作成
CREATE APPLICATION PACKAGE SAMPLE_APP;

/////////////////////////////////////////////////
//Ⅱ. アプリパッケージのステージに設定ファイルをPUT//
/////////////////////////////////////////////////
//パッケージに、設定ファイルを保存するためのスキーマ、名前付きステージを作成する
CREATE SCHEMA SAMPLE_APP.ENV;
CREATE OR REPLACE STAGE SAMPLE_APP.ENV.FILE_STAGE DIRECTORY = ( ENABLE = true ) COMMENT = '';

//パッケージのステージ上に設定ファイルをPUTする
put file://C:\Users\username\desktop\manifest.yml @SAMPLE_APP.ENV.FILE_STAGE/V1 OVERWRITE = TRUE;
put file://C:\Users\username\desktop\setup.sql @SAMPLE_APP.ENV.FILE_STAGE/V1/scripts OVERWRITE = TRUE;

///////////////////////
//Ⅲ. バージョンを作成//
///////////////////////
//PUTした設定ファイルをもとに、アプリのバージョンV1を作成
ALTER APPLICATION PACKAGE SAMPLE_APP ADD VERSION "V1" USING '@SAMPLE_APP.ENV.FILE_STAGE/V1' LABEL = '';

//作成したバージョンV1をデフォルトのバージョンとして設定
//数十秒待ってから実行しないと、エラーが発生
ALTER APPLICATION PACKAGE SAMPLE_APP SET DEFAULT RELEASE DIRECTIVE VERSION = "V1" PATCH = 0;

//アプリ公開のための自動セキュリティスキャン
ALTER APPLICATION PACKAGE SAMPLE_APP SET DISTRIBUTION = EXTERNAL;

////////////////////////////
//Ⅳ. アプリパッケージを共有//
////////////////////////////
//共有に相当するSQLを記述

本手法のようにSnowSQLのみで実施しようとする場合、いくつか問題点があります。(のちのセクションで説明)

・逐次処理を実装する方法が難しい

・共有をコードベースで実装すると非常に複雑

3. master.sqlをSnowSQLで実行

自身のSnowflakeアカウントにSnowSQLからログインし、先ほどローカルPC上で作成したmaster.sqlを実行していきます。

SOURCEコマンドを用いて、sqlファイルを実行できます!

これによって、master.sqlに含まれるSQLクエリを一斉実行できます。

//Snowflakeアカウントにログイン
snowsql -a xx00000.yyyy.zzz -u USERNAME;
password: PASSWORD

//sourceコマンドで、master.sqlに入っているクエリを一斉実行
! source //C:\Users\username\desktop\master.sql

SnowSQLを使う場合のいいところ・問題点

ここまで、SnowSQLを使う場合の手順を説明してきましたが、いいところと問題点を記述していきます。

いいところ

エディタだけで実質開発可能!

VSCodeでターミナルとsqlファイルを同時に開くことで、ほぼVSCode上だけで開発可能です。

ステージに上げる場合も、VSCode上でSnowSQLを開いてPUTすればいいので楽です。

工程ごとにSQLファイルで括れる!

master.sqlの中で、別のsqlファイルを実行できるので、

工程ごとにsqlファイルにまとめて、master.sqlの中で工程ごとのsqlを実行するという書き方ができます。

これによって、コードの管理方法に幅が広がります。

//C:\Users\username\desktop\master.sqlに作成

//Ⅰ. アプリパッケージを作成 工程を実行
!source C:\Users\usename\desktop\sql1.sql;

//Ⅱ. アプリパッケージのステージに設定ファイルをPUT 工程を実行
!source C:\Users\usename\desktop\sql1.sql;
//C:\Users\username\desktop\sql1.sqlに作成

/////////////////////////// 
//Ⅰ. アプリパッケージを作成// 
/////////////////////////// 
//パッケージを作成
CREATE APPLICATION PACKAGE SAMPLE_APP; 
//C:\Users\username\desktop\sql2.sqlに作成

///////////////////////////////////////////////// 
//Ⅱ. アプリパッケージのステージに設定ファイルをPUT// 
///////////////////////////////////////////////// 
//パッケージに、設定ファイルを保存するためのスキーマ、名前付きステージを作成する 
CREATE SCHEMA SAMPLE_APP.ENV; 
CREATE OR REPLACE STAGE SAMPLE_APP.ENV.FILE_STAGE DIRECTORY = ( ENABLE = true ) COMMENT = ''; 

問題点

SnowSQLを開発環境にするには、いくつか問題点があります。

共有をコードベースで実装すると非常に複雑

コードベースでの共有手順のレファレンスが不足しているため、実装が大変です。

※ 一応、Query Historyで、共有設定した時間帯と赤枠をオンにした状態で、クエリ実行履歴を表示すれば、

共有に該当するSQLを見つけることができます。

逐次処理に弱い?

アプリ開発の中では、数十秒待たないとSnowflakeの内部で変更が反映されない処理があります。(下例)

/////////////////////// 
//Ⅲ. バージョンを作成// 
/////////////////////// 
//PUTした設定ファイルをもとに、アプリのバージョンV1を作成 
ALTER APPLICATION PACKAGE SAMPLE_APP ADD VERSION "V1" USING '@SAMPLE_APP.ENV.FILE_STAGE/V1' LABEL = ''; 

-- ↓ バージョンV1を作成されたことが確認出来たら、、、という処理が欲しい!!

//作成したバージョンV1をデフォルトのバージョンとして設定 
//数十秒待ってから実行しないと、エラーが発生 
ALTER APPLICATION PACKAGE SAMPLE_APP SET DEFAULT RELEASE DIRECTIVE VERSION = "V1" PATCH = 0; 

その場合、「前の処理が実行し終わったことを確認して、次の処理を実行」という工程が必要です。

「前の処理のクエリの実行状態がSUCCESSになるまで待つ」という条件を付けながら、次のクエリを実行するという操作ができそうであれば、逐次処理に相当する手法も再現可能だと思います。

おわりに

truestarではSnowflakeの検討、導入支援や環境構築からアプリ開発まで幅広くサポート可能です。

Snowflakeに゙興味がある、導入済みだけどもっとうまく活用したい等々ありましたら、ぜひこちらから相談ください!

これまでのSnowflakeに関する記事はこちら

MarketPlaceにてリリースした「逆ジオコーディングアプリ」や、その開発裏話もどうぞ!