Snowflakeに対してPythonで外部SQLファイルを実行してみよう
こんにちは!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)
pyenv
とpipenv
を利用しており、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
ディレクトリを作成して、その中に配置しました。
SELECT r_regionkey , r_name , r_comment FROM tpch_sf1.region ;
Pythonコードと.envファイルの作成
次に、Pythonコードと.env
ファイルを作成します。
Pythonコードですが、ファイルを読み込んでquery
変数として取得し、読み込んだものをconnection
のcursor
から実行するだけです。 connection
については、今回はデータの取得を行うクエリなのでSNOWFLAKE_WAREHOUSE
、SNOWFLAKE_DATABASE
,SNOWFLAKE_SCHEMA
を環境変数から取得して、設定するようにしています。
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_WAREHOUSE
、SNOWFLAKE_DATABASE
、SNOWFLAKE_SCHEMA
を指定しています。SNOWFLAKE_WAREHOUSE
には、自分の環境で作成済みの適切なWarehouseを指定しておきます。
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をコードに直接記述せずに外部ファイル化して実行することができますね。
どなたかのお役に立てば幸いです。それでは!