0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

Snowflake Python Connectorのための環境を direnv + pip-tools で構築してみる!

Last updated at Posted at 2023-07-19

1. はじめに

今回は、Snowflake Python Connectorのための環境をdirenvとpip-toolsを使って構築してみた記事です!

今回の作業環境は以下のとおりです。

【作業環境】
・ チップ Apple M1
・ macOS Ventura 13.3

※その他、Snowflake関連記事はコチラです!参考までにご覧ください!

2. direnv(python標準のvenv)とpip-toolsで環境構築する!

① Python環境の構築

Python環境を構築する際にはpipenvを利用していましたが(それくらいしか知らなかった😅)、今回はこちらのブログを参考にさせていただき、direnvを利用してpipenvではなくpython標準のvenvによる環境構築を行ってみました!

② direnvで仮想環境立ち上げの自動化

direnvを使うと、特定のディレクトリに出入りすると仮想環境の立ち上げ・終了が自動化できます。
立ち上げ忘れとかがなくなるので、すごく楽でした!

direnvはHomebrewでインストールできます。

brew install direnv

brewでインストールしたら、こちらにあるように.zshrc等にフックを登録します。

~/.zshrcに下記を追加する。

eval "$(direnv hook zsh)"

次に、仮想環境を構築するディレクトリに.envrcを作成します。
その.envrcに下記のとおり書いておくと、そのディレクトリに移動すると自動で仮想環境がactivate/deactivateされます。

layout python

※Python バージョンを指定した仮想環境の作成
任意の Python バージョンを指定したい場合は、pyenv を使いましょう。(pyenvはpythonのバージョン管理ソフト。brewでインストール可能。インストール後に.zshrcにaliasを要設定。)

pyenvがインストール済なら.envrc

layout python ~/.pyenv/versions/3.X.X/bin/python

のように Python のパスを末尾に書けば、3.X.X のバージョンで仮想環境が作成されます。
(事前にpyenvで使いたいバージョンをインストールしておく必要があります。)

③ pip-toolsでライブラリ管理

ライブラリ管理はpip-toolsで行います。使い方はこちらのQiitaがわかりやすかったです!

作成した仮想環境でpip-toolsをインストールします。

pip install pip-tools

次に、requirements.inというファイルを作業フォルダ内に作成して、インストールしたいライブラリを記述します。
今回は、下記の2つを記述しました。

snowflake-connector-python
python-dotenv

requirements.inを作成したら、下記のコマンドでrequirements.txtを作成します。

pip-compile requirements.in

そして、pip-syncrequirements.txtを読み込んで、必要なパッケージをインストールします。

pip-sync

普通のpip installと違って、以前インストールしていたけど使わなくなったパッケージをアンインストールしてくれます。

とのこと。(上記Qiita記事より引用)

④ python-dotenvを使って環境変数を設定する

環境変数を使ってsnoflakeへのログイン情報を管理するために、python-dotenvを使います。
こちらのQiitaがわかりやすかったです!
python-dotenvはpip-toolsのrequirements.inに記載したのでインストールされています。

まず、作業フォルダ内に.envファイルを作ります。(ターミナルから作成していっても良いです。)
次に、ログイン情報を記載しましょう。

SNOWFLAKE_USER="<各自のユーザーネーム>"
SNOWFLAKE_PWD="<各自のパスワード>"
SNOWFLAKE_ACC="<アカウント>"

python内での呼び出しはこんな感じです。

import os
from dotenv import load_dotenv

load_dotenv() #.envファイルの読み込み

# 読み込んだ環境変数をpythonの変数に代入
USER = os.getenv('SNOWFLAKE_USER')
PASSWORD = os.getenv('SNOWFLAKE_PWD')
ACCOUNT = os.getenv('SNOWFLAKE_ACC')

以上で、準備OKです。
ここまでで、こんな形のフォルダ構成になっています。

.
├── .direnv/python-3.xx.x   # direnvによって自動で作られた仮想環境
├── .env
├── .envrc
├── requirements.in
└── requirements.txt

direnv(pyenv)とpip-toolsで共通の環境を構築する

direnv.envrcでのpythonバージョンの指定と、pip-toolsのrequirements.txtによるライブラリ管理で、これらのファイルを共有すれば共通の環境を再現できます!

⑤ Snowflake Python Connectorを使った接続

あとは、公式チュートリアルに従って進めれば接続できます!!!!
以下、参考までにチュートリアルで使ったpythonコードです。

import snowflake.connector
import os
from dotenv import load_dotenv

load_dotenv() #.envファイルの読み込み

# 読み込んだ環境変数をpythonの変数に代入
USER = os.getenv('SNOWFLAKE_USER')
PASSWORD = os.getenv('SNOWFLAKE_PWD')
ACCOUNT = os.getenv('SNOWFLAKE_ACC')

# Snowflakeへのコネクション作成
conn = snowflake.connector.connect(
    user=USER,
    password=PASSWORD,
    account=ACCOUNT,
    session_parameters={
        'QUERY_TAG': 'EndOfMonthFinancials',
    }
)

# ウェアハウスの作成と使用
conn.cursor().execute("CREATE WAREHOUSE IF NOT EXISTS tiny_warehouse_mg")
conn.cursor().execute("USE WAREHOUSE tiny_warehouse_mg")

# データベースの作成と使用
conn.cursor().execute("CREATE DATABASE IF NOT EXISTS testdb")
conn.cursor().execute("USE DATABASE testdb")

# スキーマの作成と使用
conn.cursor().execute("CREATE SCHEMA IF NOT EXISTS testschema")
conn.cursor().execute("USE SCHEMA testschema")

# テーブルの作成
conn.cursor().execute(
    "CREATE OR REPLACE TABLE "
    "test_table(col1 integer, col2 string)")

# データインサート
conn.cursor().execute(
    "INSERT INTO test_table(col1, col2) "
    "VALUES(123, 'test string1'),(456, 'test string2')")

# ファイルからアップロードしてインサート
conn.cursor().execute("PUT file:///tmp/data/file* @%test_table") # ステージング
conn.cursor().execute("COPY INTO test_table") # コピー

# クエリの実行
# パターン1
col1, col2 = conn.cursor().execute("SELECT col1, col2 FROM test_table").fetchone()
print('{0}, {1}'.format(col1, col2))

# パターン2
for (col1, col2) in conn.cursor().execute("SELECT col1, col2 FROM test_table"):
	print('{0}, {1}'.format(col1, col2))

# コネクションを切断
conn.close()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?