ストアドプロシージャの Python ハンドラーの書き方¶
ストアドプロシージャが呼ばれたときに実行するハンドラーとして Python コードを書くことができます。このセクションでは、ハンドラーの設計について説明します。
ハンドラーコードからストアドプロシージャを作成するには、いくつかの方法があります。
プロシージャを作成する SQL ステートメントにコードをインラインで含めます。 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
コードをステージにコピーして、プロシージャの作成時に参照することができます。 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
コードを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;
メソッドまたは関数の記述¶
ストアドプロシージャのメソッドまたは関数を記述するときは、次の点に注意してください。
メソッドまたは関数の最初の引数として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 句を使用して、依存ファイルを指定します。