Snowflakeのストアドプロシージャを使ってPythonからSnowflakeへSQLクエリを投げてみた

Snowflakeのストアドプロシージャを使ってPythonからSnowflakeへSQLクエリを投げてみた

Snowflakeのストアドプロシージャを試してみた話。Pythonをそのまま実行できるので、便利です。
Clock Icon2024.08.07

みなさん、こんにちは。クルトンです!

今回はタイトル通り、ストアドプロシージャの中身をPythonコードで記述し、SnowflakeへSQLクエリを投げてみました。ストアドプロシージャは、Snowflakeの定期実行の機能であるTASKにおいても使用できるため、好きなSQLクエリを実行するために使えそうです。

という事で早速実装していきます。

やってみた

前準備

自分の環境ではすでにDBは用意していたので、スキーマから準備していきます。DBで気軽に使えそうなものがない場合は、新規のものをCREATE DATABASE文を使って作成してから、以下のSQLを実行していってください。

-- 権限が不安な方は実行を簡単にするため強めの権限を持つロールを使用
USE ROLE ACCOUNTADMIN;

-- データベース指定
USE DATABASE <お使いのDB>; -- なければ新規作成してください

-- スキーマから準備
CREATE OR REPLACE SCHEMA test_procedure;

CREATE OR REPLACE TABLE test_procedure_table(col1 varchar(5));

INSERT INTO test_procedure.test_procedure_table VALUES
    ('test1'),('test2'), ('test3'), ('test4'), ('test5');

SELECT * FROM TEST_PROCEDURE.TEST_PROCEDURE_TABLE;

SQLを実行してみると、以下のように新規作成したテーブルからデータが取得できているかと思います。

002

ストアドプロシージャ作成と呼び出しまで

以下のSQLでストアドプロシージャを作成します。

CREATE OR REPLACE PROCEDURE TEST_PROCEDURE(
    db_name string,
    schema_name string,
    table_name string
)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'main'
AS
$$
from snowflake.snowpark import Session

def main(db_name: str, schema_name: str, table_name: str):
    connection_parameters = {
        "account": "<your snowflake account>",
        "user": "<your snowflake user>",
        "password": "<your snowflake password>"
    }
    with Session.builder.configs(connection_parameters).create() as session:
        query = f"SELECT * FROM {db_name}.{schema_name}.{table_name};"
        data = session.sql(query).collect()

    return data
$$
;

変数connection_parametersの中身をご自分の環境に合わせて書き換えてください。

アカウント名については、以下の画像のように、Snowsight(Snowflakeの画面上)の左下にアイコンがあるのでクリックすると確認できます。
003

次にストアドプロシージャを実行してみます。

-- ストアドプロシージャを呼び出す
CALL TEST_PROCEDURE('<お使いのDB名>', 'test_procedure', 'test_procedure_table');

表示の仕方は違うものの、SQLを実行した時と同じようにテーブルの値が取得できました!

004

後片付け

スキーマ配下に、テーブルとストアドプロシージャは存在するため、以下のSQLを実行すれば後片付け完了です。

DROP SCHEMA test_procedure;

終わりに

ここまでで、ストアドプロシージャを簡単に試してみました。

ちなみにPythonコード自体が間違っている場合は、以下のようにPythonコード上で何行目にエラーが出ているかなど、出力してくれるので便利です。

下記の画像では「今使っているPythonコード上でstringという型はないよ!」というエラーが出力されているため、「strと直したら良さそうだな」と分かります。
001

今回はここまで。それでは、また!

参考サイト

https://docs.snowflake.com/ja/developer-guide/snowpark/python/creating-session

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.