🤝

Snowflake ワークシートを Git で共有&管理する試み

2024/02/20に公開

はじめに

Snowflake でアドホックな集計やクエリ調査、リカバリ作業をしたときのワークシートを、チーム内で共有することがよくあります。そう、よくあるんです。結構頻繁に発生するのです。
そんなとき、ワークシートでの操作1つで共有できるのはとても便利ですよね。
しかしながら、アカウントを超えてワークシートを共有したいときって、あるじゃないですか?

そんなときに便利そうなパッケージがこちら。

https://github.com/tdambrin/sf_git

Snowflake ワークシートを Git でバージョン管理するためのパッケージです。このパッケージをちょっと使ってみたので、ご紹介します。

使ってみる

sf_git のインストール手順は 本家README を参照。

環境設定

sf_git をインストールしたら、まずは Git 連携対象とする Snowflake アカウントの情報を登録。

$ sfgit config --git-repo /home/sf
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
Set SNOWFLAKE_VERSIONING_REPO to /home/sf
sf_git.conf

設定の本体はこのファイルらしい。

$ cat /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
SNOWFLAKE_VERSIONING_REPO='/home/sf'
WORKSHEETS_PATH='/tmp/trash/worksheets'
SF_ACCOUNT_ID='tofill.west-europe.azure'
SF_LOGIN_NAME='TOFILL'

ワークシート保存先ディレクトリを指定する。

$ sfgit config --save-dir  /home/sf/worksheets
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
Set WORKSHEETS_PATH to /home/sf/worksheets
sf_git.conf

WORKSHEETS_PATH が置き換わった。

$ cat /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
SNOWFLAKE_VERSIONING_REPO='/home/sf'
WORKSHEETS_PATH='/home/sf/worksheets'
SF_ACCOUNT_ID='tofill.west-europe.azure'
SF_LOGIN_NAME='TOFILL'

他の項目も設定していく。

$ sfgit config --account xy00000.ap-northeast-1.aws
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
Set SF_ACCOUNT_ID to xy00000.ap-northeast-1.aws
$ sfgit config --username m.kajiya
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
Set SF_LOGIN_NAME to m.kajiya
sf_git.conf
$ cat /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
SNOWFLAKE_VERSIONING_REPO='/home/sf'
WORKSHEETS_PATH='/home/sf/worksheets'
SF_ACCOUNT_ID='xy00000.ap-northeast-1.aws'
SF_LOGIN_NAME='m.kajiya'

ワークシートを取得する

sfgit fetch を実行。ここではパスワード認証で実行してみる。

$ sfgit fetch --username "m.kajiya" --account-id "xy00000.ap-northeast-1.aws" --auth-mode PWD --password "<your_password>"
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
 ## Authenticating to Snowsight ##
auth with m.kajiya and <your_password>
 ## Authenticated as m.kajiya##
 ## Getting worksheets ##
[Worksheets] Saving to /home/sf/worksheets
[Worksheets] Saved
## Got worksheets ##
           _id  ... content_type
0  2XkUyegck0R  ...          sql
1  3gbi0mGqyFg  ...          sql
2  278LmLA1XCR  ...          sql
3  4i679ZspIon  ...          sql
4  4spSGf2b1tv  ...          sql
5  2Jt3Jrm2BuN  ...          sql
6  2MhNtBmpQ1G  ...          sql
7  3L7P0n7EzTQ  ...          sql
8  4bsVTXMVs8F  ...          sql

[9 rows x 6 columns]
## Worksheets saved to /home/sf/worksheets ##

9 rows

Snowflake アカウントで作成したワークシートと同数。削除したワークシートは数に入っていない。
実体は、ワークシートの内容をそのまま保存した sql ファイルと[1]、ワークシートに対応するメタデータファイル(JSON)になっている。

こんな感じ(シート名が雑すぎてたいへん見苦しいが、気にしてはいけない)
$ ls -aR ./worksheets/
./worksheets/:
.
..
.2023-07-19_9_10pm_metadata.json
.2023-07-29_2_28pm_metadata.json
.NativeApps_metadata.json
.Query_-_01ade902-0001-058d-0000-2db50023a542_metadata.json
.SNOWFLAKE_SAMPLE_DATA__metadata.json
.SnowDemo_metadata.json
.Streamlit_Privileges_Script_for_Admin_metadata.json
.add_new_sheet_metadata.json
.create_sf_git_users_metadata.json
2023-07-19_9_10pm.sql
2023-07-29_2_28pm.sql
Import_2023-01-17
NativeApps.sql
Query_-_01ade902-0001-058d-0000-2db50023a542.sql
SNOWFLAKE_SAMPLE_DATA_.sql
SnowDemo.sql
Streamlit_Privileges_Script_for_Admin.sql
add_new_sheet.sql
create_sf_git_users.sql

./worksheets/Import_2023-01-17:
.
..
.grant_ACCOUNTADMIN_metadata.json
.share_metadata.json
grant_ACCOUNTADMIN.sql
share.sql

ワークシートをコミットする

次に sfgit commit コマンドで、ワークシートのファイルを Git に登録してみる。

$ sfgit commit
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
## Committed worksheets to branch main

何が起きているのかというと、ワークシート保存ディレクトリ下のファイルを自動的にステージングして、自動的にコメント付けてコミットしている、というわけ。
(コメントと、対象ブランチは sfgit commit コマンドのオプションで指定可能)

$ git log --name-only
commit da8ba6d57b143f7fc0247a6004e79b9ef6ba7642 (HEAD -> main)
Author: ***********
Date:   Sat Feb 17 11:42:10 2024 +0000

    [UPDATE] Snowflake worksheets

worksheets/.2023-07-19_9_10pm_metadata.json
worksheets/.2023-07-29_2_28pm_metadata.json
worksheets/.NativeApps_metadata.json
worksheets/.Query_-_01ade902-0001-058d-0000-2db50023a542_metadata.json
worksheets/.SNOWFLAKE_SAMPLE_DATA__metadata.json
worksheets/.SnowDemo_metadata.json
worksheets/.Streamlit_Privileges_Script_for_Admin_metadata.json
worksheets/2023-07-19_9_10pm.sql
worksheets/2023-07-29_2_28pm.sql
worksheets/Import_2023-01-17/.grant_ACCOUNTADMIN_metadata.json
worksheets/Import_2023-01-17/.share_metadata.json
worksheets/Import_2023-01-17/grant_ACCOUNTADMIN.sql
worksheets/Import_2023-01-17/share.sql
worksheets/NativeApps.sql
worksheets/Query_-_01ade902-0001-058d-0000-2db50023a542.sql
worksheets/SNOWFLAKE_SAMPLE_DATA_.sql
worksheets/SnowDemo.sql
worksheets/Streamlit_Privileges_Script_for_Admin.sql

ワークシートを更新する

Git 側でワークシートを更新して、Snowflake ワークシートに反映してみたい。

ということで、Git側でワークシートファイルを操作してみる。

① ワークシートを Git 側で追加する

add_new_sheet.sql を追加、一緒に .add_new_sheet_metadata.json も追加する。

② ワークシートの内容を Git 側で変更する

Query_-_01ade902-0001-058d-0000-2db50023a542.sql を変更。

$ git status
On branch main
Your branch is ahead of 'origin/main' by 3 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   worksheets/Query_-_01ade902-0001-058d-0000-2db50023a542.sql

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        worksheets/.add_new_sheet_metadata.json
        worksheets/add_new_sheet.sql

コミットしてみる。

# sfgit commit
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
## Committed worksheets to branch main

# git log --name-only
commit 16e300220566adddca9fd057b21d5c36d63f09ea (HEAD -> main)
Author: ***********
Date:   Sat Feb 17 11:57:05 2024 +0000

    [UPDATE] Snowflake worksheets

worksheets/Query_-_01ade902-0001-058d-0000-2db50023a542.sql
worksheets/.add_new_sheet_metadata.json
worksheets/add_new_sheet.sql

追加したもの、更新したものがコミットされているようす。
それでは、Snowflake ワークシートに反映してみよう。 sfgit push コマンドを実行する。

$ sfgit push \
        --username "m.kajiya" \
        --account-id "xy00000.ap-northeast-1.aws" \
        --auth-mode PWD --password <your_password>
loading dotenv from /usr/local/lib/python3.10/site-packages/sf_git/sf_git.conf
 ## Authenticating to Snowsight ##
 ## Authenticated as m.kajiya##
 ## Getting worksheets from cache for user m.kajiya ##
[Worksheets] Loading from /home/sf/worksheets
## Got worksheets ##
           _id  ... content_type
0  2XkUyegck0R  ...          sql
1  3gbi0mGqyFg  ...          sql
2  2Jt3Jrm2BuN  ...          sql
3  4i679ZspIon  ...          sql
4  278LmLA1XCR  ...          sql
5  4spSGf2b1tv  ...          sql
6  2MhNtBmpQ1G  ...          sql
7  3WQcEs0huax  ...          sql
8  3L7P0n7EzTQ  ...          sql
9  4bsVTXMVs8F  ...          sql

[10 rows x 6 columns]
## Uploading to SnowSight ##
 ## Writing local worksheet to SnowSight for user m.kajiya ##
updating worksheet 2023-07-19 9:10pm
updating worksheet 2023-07-29 2:28pm
updating worksheet NativeApps
updating worksheet SNOWFLAKE_SAMPLE_DATA
updating worksheet SnowDemo
updating worksheet Streamlit Privileges Script for Admin
creating worksheet add_new_sheet
updating worksheet grant ACCOUNTADMIN
updating worksheet share
 ## SnowSight updated ##
## Uploaded to SnowSight ##

Snowsight でワークシートを確認すると...

Git 側での変更が反映されていますね。

おわりに

Git への連携ができると、アカウントを超えてクエリ共有ができて良いですね。アカウント間での共有も試してみたいと思っています。
さらに、Snowflake ワークシートを push できる GitHub Actions もあるので、こちらも試してみたいです!

https://github.com/marketplace/actions/sf-git-push-action

脚注
  1. Python があれば Python も出てくると思われる ↩︎

Discussion