こんにちは! 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にてリリースした「逆ジオコーディングアプリ」や、その開発裏話もどうぞ!