この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは!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
ディレクトリを作成して、その中に配置しました。
sql/select_region.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
を環境変数から取得して、設定するようにしています。
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_WAREHOUSE
、SNOWFLAKE_DATABASE
、SNOWFLAKE_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をコードに直接記述せずに外部ファイル化して実行することができますね。
どなたかのお役に立てば幸いです。それでは!