SnowflakeでGitを使う例

このトピックの例では、Snowflake アプリケーションの開発時にリモートの Git リポジトリのファイルを使用する方法と、Git リポジトリのクローンで SQL スクリプトを実行する方法について説明します。

Git リポジトリのクローンを操作するその他の方法については、以下を参照ください。

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

ファイルをコミットし、Gitリポジトリのクローンを更新します。

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

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

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

    Snowflake とリモートの Git リポジトリとの統合をセットアップ した結果、Snowflake に Git リポジトリのクローンができたとすると、リモートリポジトリからフェッチして Git リポジトリのクローンをリフレッシュすることができます。

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

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

    ALTER GIT REPOSITORY snowflake_extensions FETCH;
    
    Copy

Git リポジトリのクローンにあるファイルを使用するプロシージャを作成し、実行します。

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

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

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

    次の例のコードでは、 filter_by_role というプロシージャを作成し、Git リポジトリのクローンに保存されているハンドラーコードを指定します。

    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リポジトリのクローンファイルを使用します。

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

この例では、 EXECUTE IMMEDIATE FROM コマンドを使って、Git リポジトリ・クローンのファイルに含まれる 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

    詳細な手順については、 ファイルをコミットし、Gitリポジトリのクローンを更新します。 をご参照ください。

  3. Git リポジトリのクローンをリフレッシュします。

    Git リポジトリのクローンをリフレッシュ configuration_repo:

    ALTER GIT REPOSITORY configuration_repo FETCH;
    
    Copy

    詳細な手順については、 ファイルをコミットし、Gitリポジトリのクローンを更新します。 をご参照ください。

  4. Snowflakeで、Gitリポジトリクローンのファイルを実行します。

    注釈

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

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