【Snowflake】UI付Native Appとお友達になろう!デバッグTips

【Snowflake】UI付Native Appとお友達になろう!デバッグTips | Tableau-id Press -タブロイド-
snowflake_logo

こんにちは。ozawaです。

今回は、Snowflake Native ApplicationとStreamlitを組み合わせた、UI付アプリの開発裏話として、

UI付アプリのデバッグの試行錯誤について執筆していきたいと思います。

 

エラー文さえ出てくれれば、該当箇所を修正すればエラーが解消されますが、

UI付アプリの場合は、エラー文が出ないエラーがまれに発生するため、デバッグのしようがないケースがありました。

 

今回は、エラー文が出ないエラーが出てくる場面と、デバッグ方法を紹介していきます。

 

現状のUI付アプリのデバッグ問題

UI付アプリはNative Applicationに対して、Streamlitで画面を付けることで実装できます。

UI付アプリの開発段階では、大きく分けて2つのスコープでのエラーが発生します。

 

① Streamlit.py内でのエラー

② Streamlit.pyから呼び出されたバックエンドのエラー

 

Streamlit内のエラーの場合、Streamlitおなじみの赤いハイライトのエラーが表示されますが、

エラー文をもとに該当箇所を修正してあげることで、エラーは解消されます。

一方で、Streamlitから呼び出されたバックエンドの中でエラーが出た場合に、エラー文の出ないエラーがスクリプトの仕様によっては発生します。

ここからは筆者が直面したエラー文が見れない!(泣)ケースを紹介します。

 

① バックエンドが失敗してもテーブルが無事だとエラーは生じない

筆者の場合、あるテーブルAがあり、Streamlitからプロシージャを実行すると、テーブルAが更新されるスクリプトを組んだのですが、

プロシージャでエラーになった場合に、Streamlit上にエラーが表示されない場面がありました。

 

これは、プロシージャが成功しようとも失敗しようとも、テーブルのカラム構成が変わらない場合に、

Streamlitでテーブルを取得して実行する分にはエラーが生じないためです。

 

②エラーがクエリ履歴で見れない

Streamlitを実行した場合、クエリとしては、

「execute streamlit」を実行 → streamlit内の諸々の処理を実行

という流れなのですが、クエリ履歴を確認すると、streamlit内の諸々の処理に該当するクエリの詳細は見ることができません。

 

したがって、Streamlitでエラーが生じたとしても、クエリ履歴ではどこの何のエラーなのかを表示せず、エラー解消へと繋げることができません。

対処方法

Streamlitに接続されたプロシージャから、エラー文or成功文がリターンされるようになれば、Streamlit側で表示することができます。

 

① プロシージャでエラー文/成功文をリターンする

コード例は以下の通りです。

--例外処理を追加したプロシージャを作成
create or replace procedure db.schema.procedure(variable1, variable2)
  returns string(variable1, variable2)
  returns string
  language sql
as
BEGIN
    SELECT * FROM XXXX;
    return 'success'

EXCEPTION --例外処理(何のエラーが出たのかを出力)
  WHEN OTHER THEN
    error_message := 'エラー発生: エラーコード = '|| SQLCODE || ', エラー文 = '|| SQLERRM;
    return error_message;
END;

まずExecptionというプロシージャのオプションを追加します。

Execptionは例外的な動作(エラー)がプロシージャに起こった場合に、Execption内のフローに強制移動してくれます。

次にリターン文として成功文/エラー文を設定します。

 

エラーなしで無事実行できた場合用に、Begin文の最後に「Success」を追加して、成功文としてリターンします。

対して、エラーが生じた場合用に、Execption文の最後に「Error Message」を追加して、失敗文としてリターンします。

 

② Streamlit側でエラー文/成功文を出力

コードは以下の通りです。

result = session.call('db.schema.procedure', 'variable1', 'variable2') //プロシージャの実行

st.write(result)

session.call関数で プロシージャを実行し、リターンとして返ってきた成功文/失敗文を result に格納します。

最後に、st.writeでresultを表示します。

 

対処した結果…

手順1,2を踏むことで、

streamlit側で成功文/エラー文が表示されるようになりました~~~~!!!

//プロシージャが無事動いた場合
Success

//プロシージャでエラーが出た場合
エラー発生:エラーコード = 11111, エラー文 = Syntax Error ~~~ (例)

このようにして、例外処理を駆使して、UI付のアプリのプロシージャ含めたバックエンドのデバッグ作業を行っていただければと思います。

おわりに

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

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

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

Streamlit in Snowflakeの試行錯誤記事のようにNative AppやStreamlit in Snowflakeに関する調査も行っています!

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