SnowflakeでGitを使う例¶
このトピックの例では、Snowflakeアプリケーションの開発時に統合Gitリポジトリを使用する方法と、リポジトリ内で SQL スクリプトを実行する方法について説明します。
Gitリポジトリファイルをストアドプロシージャのハンドラーとして使用します。¶
SnowflakeとGitリポジトリ間の統合を設定 したら、リポジトリのファイルをストアドプロシージャおよび UDFs のハンドラーコードとして使用できるようになります。 他のステージド・ハンドラー と同様に、ハンドラー関数名には、それを含むクラス名またはモジュール名を修飾しなければならないことに注意してください。
この例では、リポジトリのPythonハンドラーコードをストアドプロシージャで使用する方法を説明します。
この例で必要なコード¶
この例のハンドラーは、次のような SQL コードで作成されたデータベースに依存しています。
CREATE DATABASE example_db;
USE DATABASE example_db;
CREATE SCHEMA example_schema;
USE SCHEMA example_schema;
CREATE OR REPLACE TABLE employees(id NUMBER, name VARCHAR, role VARCHAR);
INSERT INTO employees (id, name, role) VALUES (1, 'Alice', 'op'), (2, 'Bob', 'dev'), (3, 'Cindy', 'dev');
この例では、 filter.py
に含まれる次のPythonハンドラーコードを使用しています。
from snowflake.snowpark.functions import col
def filter_by_role(session, table_name, role):
df = session.table(table_name)
return df.filter(col("role") == role)
ファイルをコミットし、リポジトリのステージをリフレッシュする¶
Gitクライアントから、コードをリポジトリに追加します。
次の例のコードでは、gitコマンドラインツールを使用してハンドラーファイルをローカルリポジトリに追加してコミットし、Snowflakeのリポジトリステージによって参照されるリモートリポジトリにプッシュします。
$ git add python-handlers/filter.py $ git commit -m "Adding code to filter by role" $ git push
Snowflakeで、リポジトリステージをリフレッシュします。
SnowflakeとGitリポジトリ間の統合を設定 してリポジトリステージが作成されていると仮定すると、リポジトリからフェッチすることでステージをリフレッシュできます。
Snowflakeを使用してリポジトリからリフレッシュする方法は、他のGitクライアントツールを使用する場合と似ており、作業を開始する前にリポジトリからフェッチして、最新の変更があることを確認します。
次の例のコードは、 ALTER GIT REPOSITORY コマンドを実行してリポジトリから最新の変更を取得します。コードは、ブランチ、タグ、コミットを含む完全なクローンを生成します。
ALTER GIT REPOSITORY snowflake_extensions FETCH;
リポジトリ内のファイルを使用するプロシージャを作成して実行する¶
Snowflakeでプロシージャを記述します。
プロシージャを記述するときに、リポジトリステージのコードファイルの場所にあるハンドラーコードを参照できます。たとえば、
snowflake_extensions
というGitリポジトリのステージに同期しているリポジトリのメインブランチにあるpython-handlers/filter.py
というファイルを参照するには、次のような構文を使用します。@snowflake_extensions/branches/main/python-handlers/filter.py
次の例のコードは、
filter_by_role
というプロシージャを作成し、リポジトリステージに格納されているハンドラーコードを指定します。CREATE OR REPLACE PROCEDURE filter_by_role(tableName VARCHAR, role VARCHAR) RETURNS TABLE(id NUMBER, name VARCHAR, role VARCHAR) LANGUAGE PYTHON RUNTIME_VERSION = '3.9' PACKAGES = ('snowflake-snowpark-python') IMPORTS = ('@example_db.example_schema.snowflake_extensions/branches/main/python-handlers/filter.py') HANDLER = 'filter.filter_by_role';
プロシージャを実行します。
次のコードはプロシージャを実行します。
CALL filter_by_role('employees', 'dev');
次は、プロシージャからの出力の例です。
--------------------- | ID | NAME | ROLE | --------------------- | 2 | Bob | dev | --------------------- | 3 | Cindy | dev | ---------------------
Gitリポジトリファイルを使用して新しいアカウントを設定する¶
この例では、リポジトリステージに含まれる SQL スクリプトを実行する方法を説明します。例のスクリプトでは、ユーザーとロールを作成します。
この例では、 EXECUTE IMMEDIATE FROM コマンドを使用して、リポジトリステージのファイルに含まれる SQL ステートメントを実行します。
EXECUTE IMMEDIATE FROM を使用すると、Gitリポジトリで管理しているスクリプトを(どのSnowflakeセッションからでも)実行できます。たとえば、組織内のすべての新しいSnowflakeアカウントを設定するスクリプトがあるとします。スクリプトには、ユーザー、ロール、オブジェクトを作成し、アカウントとオブジェクトに権限を付与するステートメントが含まれている場合があります。
次の内容で、ファイル
setup.sql
を作成します。CREATE ROLE analyst; CREATE USER gladys; GRANT ROLE analyst TO USER gladys; SHOW GRANTS TO USER gladys;
SQL ファイルをGitリポジトリにコミットします。詳細な手順については、 ファイルをコミットし、リポジトリのステージをリフレッシュする をご参照ください。
Gitコマンドラインツールを使用して、ファイルをGitリポジトリにコミットします。
git add scripts/setup.sql git commit -m "Adding code to set up new accounts" git push
Snowflakeで、リポジトリステージをリフレッシュします。詳細な手順については、 ファイルをコミットし、リポジトリのステージをリフレッシュする をご参照ください。
リポジトリステージを更新します
configuration_repo
:ALTER GIT REPOSITORY configuration_repo FETCH;
Snowflakeで、リポジトリステージのファイルを実行します。
注釈
次のステートメントを実行するユーザーは、ファイル内のすべてのステートメントを実行するために必要な権限を持つロールを使用する必要があります。詳細については、 アクセス制御の要件 をご参照ください。
EXECUTE IMMEDIATE FROM @configuration_repo/branches/main/scripts/setup.sql;
EXECUTE IMMEDIATE FROM コマンドは、ファイル内の最後の SQL ステートメントの結果を 返します。
+-------------------------------+---------+------------+--------------+--------------+ | created_on | role | granted_to | grantee_name | granted_by | |-------------------------------+---------+------------+--------------+--------------| | 2023-07-24 22:07:04.354 -0700 | ANALYST | USER | GLADYS | ACCOUNTADMIN | +-------------------------------+---------+------------+--------------+--------------+