Snowflakeに対してPythonで外部SQLファイルを実行してみよう

2020.04.07

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

以前、SnowflakeのPython Connectorを試した際に、簡単にコード上に記述したクエリを実行しましたが「外部SQLファイルからクエリを読み込んで実行」というパターンを試していなかったので、試してみました。

前提

環境は、以前Python Connectorを試した際の環境を流用しており、Python Connectorはインストール済みとなります。

$ python --version
Python 3.8.2

$ pip --version
pip 20.0.2 from /home/ubuntu/.anyenv/envs/pyenv/versions/3.8.2/lib/python3.8/site-packages/pip (python 3.8)

pyenvpipenvを利用しており、Pipfile は以下の通りです。

$ cat Pipfile
[source]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
snowflake-connector-python = "*"

[requires]
python_version = "3.8"

SQLファイルの作成

まずは、実行するSQLファイルを準備します。 サンプルとして用意されているSNOWFLAKE_SAMPLE_DATAデータベースから、件数の少ないテーブルを取得する簡単なクエリとします。

ファイルはPythonコードを実行するディレクトリにsqlディレクトリを作成して、その中に配置しました。

sql/select_region.sql

SELECT
    r_regionkey
  , r_name
  , r_comment
FROM
  tpch_sf1.region
;

Pythonコードと.envファイルの作成

次に、Pythonコードと.envファイルを作成します。

Pythonコードですが、ファイルを読み込んでquery変数として取得し、読み込んだものをconnectioncursorから実行するだけです。 connectionについては、今回はデータの取得を行うクエリなのでSNOWFLAKE_WAREHOUSESNOWFLAKE_DATABASE,SNOWFLAKE_SCHEMAを環境変数から取得して、設定するようにしています。

run-query-with-sql-file.py

import os
import snowflake.connector


def get_connection():
    con = snowflake.connector.connect(
        user = os.environ['SNOWFLAKE_USER'],
        password = os.environ['SNOWFLAKE_PASSWORD'],
        account = os.environ['SNOWFLAKE_ACCOUNT'],
        warehouse = os.environ['SNOWFLAKE_WAREHOUSE'],
        database = os.environ['SNOWFLAKE_DATABASE'],
        schema = os.environ['SNOWFLAKE_SCHEMA']
    )
    return con


def get_query(query_file_path):
    with open(query_file_path, 'r', encoding='utf-8') as f:
        query = f.read()
    return query


def run_query(query_file_path):
    with get_connection() as connection:
        with connection.cursor() as cur:
            query = get_query(query_file_path)
            cur.execute(query)
            rows = cur.fetchall()
            for row in rows:
                print(row)


if __name__ == "__main__":
    query_file_path = 'sql/select_region.sql'
    run_query(query_file_path)

最後に、pipenvで読み込みされるように.envファイルに環境変数を設定しておきます。

前回指定したものに加えて、SNOWFLAKE_WAREHOUSESNOWFLAKE_DATABASESNOWFLAKE_SCHEMAを指定しています。SNOWFLAKE_WAREHOUSEには、自分の環境で作成済みの適切なWarehouseを指定しておきます。

.env

SNOWFLAKE_USER=xxxxx
SNOWFLAKE_PASSWORD=xxxxx
SNOWFLAKE_ACCOUNT=xxxxx
SNOWFLAKE_WAREHOUSE=xxxxx
SNOWFLAKE_DATABASE=SNOWFLAKE_SAMPLE_DATA
SNOWFLAKE_SCHEMA=TPCH_SF1

実行してみる

では、pipenvのシェルに入って実行してみます。

$ pipenv shell
Loading .env environment variables…
Launching subshell in virtual environment…

$ python run-query-with-sql-file.py 
(0, 'AFRICA', 'lar deposits. blithely final packages cajole. regular waters are final requests. regular accounts are according to ')
(1, 'AMERICA', 'hs use ironic, even requests. s')
(2, 'ASIA', 'ges. thinly even pinto beans ca')
(3, 'EUROPE', 'ly final courts cajole furiously final excuse')
(4, 'MIDDLE EAST', 'uickly special accounts cajole carefully blithely close requests. carefully final asymptotes haggle furiousl')

想定通り、SQLファイルのクエリが実行されましたね!

まとめ

以上、Snowflakeへ外部SQLファイルでクエリを実行してみました。これでSQLをコードに直接記述せずに外部ファイル化して実行することができますね。

どなたかのお役に立てば幸いです。それでは!