将 Git 与 Snowflake 结合使用的示例

本主题中的示例描述了在开发 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.8'
      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,您可以执行(从任何 Snowflake 会话)您在 Git 存储库中管理的脚本。例如,您可能有一个脚本,用于设置组织中的每个新 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 |
    +-------------------------------+---------+------------+--------------+--------------+
    
语言: 中文