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');
Copy

この例では、 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)
Copy

ファイルをコミットし、リポジトリのステージをリフレッシュする

  1. Gitクライアントから、コードをリポジトリに追加します。

    次の例のコードでは、gitコマンドラインツールを使用してハンドラーファイルをローカルリポジトリに追加してコミットし、Snowflakeのリポジトリステージによって参照されるリモートリポジトリにプッシュします。

    $ git add python-handlers/filter.py
    $ git commit -m "Adding code to filter by role"
    $ git push
    
    Copy
  2. Snowflakeで、リポジトリステージをリフレッシュします。

    SnowflakeとGitリポジトリ間の統合を設定 してリポジトリステージが作成されていると仮定すると、リポジトリからフェッチすることでステージをリフレッシュできます。

    Snowflakeを使用してリポジトリからリフレッシュする方法は、他のGitクライアントツールを使用する場合と似ており、作業を開始する前にリポジトリからフェッチして、最新の変更があることを確認します。

    次の例のコードは、 ALTER GIT REPOSITORY コマンドを実行してリポジトリから最新の変更を取得します。コードは、ブランチ、タグ、コミットを含む完全なクローンを生成します。

    ALTER GIT REPOSITORY snowflake_extensions FETCH;
    
    Copy

リポジトリ内のファイルを使用するプロシージャを作成して実行する

  1. Snowflakeでプロシージャを記述します。

    プロシージャを記述するときに、リポジトリステージのコードファイルの場所にあるハンドラーコードを参照できます。たとえば、 snowflake_extensions というGitリポジトリのステージに同期しているリポジトリのメインブランチにある python-handlers/filter.py というファイルを参照するには、次のような構文を使用します。

    @snowflake_extensions/branches/main/python-handlers/filter.py
    
    Copy

    次の例のコードは、 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';
    
    Copy
  2. プロシージャを実行します。

    次のコードはプロシージャを実行します。

    CALL filter_by_role('employees', 'dev');
    
    Copy

    次は、プロシージャからの出力の例です。

    ---------------------
    | ID | NAME  | ROLE |
    ---------------------
    | 2  | Bob   | dev  |
    ---------------------
    | 3  | Cindy | dev  |
    ---------------------
    

Gitリポジトリファイルを使用して新しいアカウントを設定する

この例では、リポジトリステージに含まれる SQL スクリプトを実行する方法を説明します。例のスクリプトでは、ユーザーとロールを作成します。

この例では、 EXECUTE IMMEDIATE FROM コマンドを使用して、リポジトリステージのファイルに含まれる SQL ステートメントを実行します。

EXECUTE IMMEDIATE FROM を使用すると、Gitリポジトリで管理しているスクリプトを(どのSnowflakeセッションからでも)実行できます。たとえば、組織内のすべての新しいSnowflakeアカウントを設定するスクリプトがあるとします。スクリプトには、ユーザー、ロール、オブジェクトを作成し、アカウントとオブジェクトに権限を付与するステートメントが含まれている場合があります。

  1. 次の内容で、ファイル setup.sql を作成します。

    CREATE ROLE analyst;
    
    CREATE USER gladys;
    
    GRANT ROLE analyst TO USER gladys;
    
    SHOW GRANTS TO USER gladys;
    
    Copy
  2. SQL ファイルをGitリポジトリにコミットします。詳細な手順については、 ファイルをコミットし、リポジトリのステージをリフレッシュする をご参照ください。

    Gitコマンドラインツールを使用して、ファイルをGitリポジトリにコミットします。

    git add scripts/setup.sql
    git commit -m "Adding code to set up new accounts"
    git push
    
    Copy
  3. Snowflakeで、リポジトリステージをリフレッシュします。詳細な手順については、 ファイルをコミットし、リポジトリのステージをリフレッシュする をご参照ください。

    リポジトリステージを更新します configuration_repo:

    ALTER GIT REPOSITORY configuration_repo FETCH;
    
    Copy
  4. Snowflakeで、リポジトリステージのファイルを実行します。

    注釈

    次のステートメントを実行するユーザーは、ファイル内のすべてのステートメントを実行するために必要な権限を持つロールを使用する必要があります。詳細については、 アクセス制御の要件 をご参照ください。

    EXECUTE IMMEDIATE FROM @configuration_repo/branches/main/scripts/setup.sql;
    
    Copy

    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 |
    +-------------------------------+---------+------------+--------------+--------------+