ストアドプロシージャの Python ハンドラーの書き方

ストアドプロシージャが呼ばれたときに実行するハンドラーとして Python コードを書くことができます。このセクションでは、ハンドラーの設計について説明します。

ハンドラーコードからストアドプロシージャを作成するには、いくつかの方法があります。

ストアドプロシージャの記述の計画

ストアドプロシージャはSnowflake内で実行されるため、それを念頭に置いて記述するコードを計画する必要があります。

  • 消費されるメモリの量を制限するSnowflakeは、必要なメモリ量に関してメソッドに制限を設けています。ガイダンスについては、 Snowflakeが課す制約内でのハンドラーの設計 をご参照ください。

  • ハンドラーメソッドまたは関数がスレッドセーフであることを確認してください。

  • ルールとセキュリティ制限に従ってください。 UDFs とプロシージャのセキュリティプラクティス をご参照ください。

  • ストアドプロシージャを 呼び出し元の権限または所有者の権限 で実行するかどうかを決定します。

  • ストアドプロシージャの実行に使用されるsnowflake-snowpark-pythonバージョンを検討してください。ストアドプロシージャのリリースプロセスには制限があるため、Pythonストアドプロシージャ環境で利用可能なsnowflake-snowpark-pythonライブラリは、通常、公開されているバージョンより1つ遅れています。次の SQL を使用して、利用可能な最新バージョンを見つけます。

    SELECT * FROM information_schema.packages WHERE package_name = 'snowflake-snowpark-python' ORDER BY version DESC;
    
    Copy

メソッドまたは関数の記述

ストアドプロシージャのメソッドまたは関数を記述するときは、次の点に注意してください。

  • メソッドまたは関数の最初の引数としてSnowpark Session オブジェクトを指定します。ストアドプロシージャを呼び出すと、Snowflakeは自動的に Session オブジェクトを作成し、ストアドプロシージャに渡します。(Session オブジェクトを自分で作成することはできません。)

  • 残りの引数と戻り値には、 Snowflakeデータ型 に対応するPython型を使用します。Snowflakeは、 パラメーターと戻り値の SQL -Pythonデータ型マッピング にリストされているPythonデータ型をサポートしています。

  • プロシージャのハンドラー内から非同期の子ジョブを実行する場合、例えば DataFrame.collect_nowait を使用する場合、"fire and forget" はサポートされません。

    言い換えると、親プロシージャのジョブが完了したときに、ハンドラーがまだ実行中の子クエリを実行した場合、子ジョブは自動的にキャンセルされます。

エラーの処理

通常のPython例外処理手法を使用して、プロシージャのエラーをキャッチできます。

メソッド内でキャッチされない例外が発生した場合、Snowflakeは例外のスタックトレースを含むエラーを発生させます。 未処理の例外のログ を有効にすると、Snowflakeは未処理の例外に関するデータをイベントテーブルに記録します。

コードで依存関係を利用できるようにする方法

ハンドラーコードが、ハンドラー自体の外部で定義されたコード(モジュールで定義されたコードなど)またはリソースファイルに依存している場合は、それらの依存関係をステージにアップロードすると、コードでそれらの依存関係を利用できるようになります。 コードで依存関係を利用できるようにする方法 を参照するか、Pythonワークシートの場合は ステージからワークシートにPythonファイルを追加する をご参照ください。

SQL を使用してストアドプロシージャを作成する場合は、 CREATE PROCEDURE ステートメント を記述するときに IMPORTS 句を使用して、依存ファイルを指定します。