Snowflake SQLAlchemy ツールキットでのPythonコネクタの使用¶
Snowflake SQLAlchemy は、Snowflakeデータベースと SQLAlchemy アプリケーションをつなぐ方言として、Snowflake Connector for Pythonの上で実行されます。
詳細については、 方言 ドキュメントをご参照ください。
前提条件¶
Snowflake Connector for Python¶
Snowflake SQLAlchemy の唯一の要件は、Python用Snowflakeコネクタです。ただし、Snowflake SQLAlchemy をインストールするとコネクタが自動的にインストールされるため、コネクタをインストールする必要はありません。
データアナリティクスとウェブアプリケーションフレームワーク(オプション)¶
Snowflake SQLAlchemy は、Pandas、JupyterおよびPyramidで使用できます。これらは、データアナリティクスおよびウェブアプリケーション用により高次のアプリケーションフレームワークを提供します。ただし、作業環境をゼロから構築することは、特に初心者ユーザーにとっては簡単な作業ではありません。フレームワークをインストールするには、Cコンパイラとツールが必要です。適切なツールとバージョンの選択は、ユーザーがPythonアプリケーションを使用することを妨げる障害になりかねません。
環境を構築する簡単な方法は、Anacondaを使用することです。これにより、データアナリストや学生などのPython以外の専門家を含むすべてのユーザーに完全なプリコンパイルテクノロジースタックが提供されます。Anacondaのインストール手順については、Anacondaのインストールドキュメントをご参照ください。その後、 pip を使用して、Snowflake SQLAlchemy パッケージをAnacondaの上にインストールできます。
詳細については、次のドキュメントをご参照ください。
Snowflake SQLAlchemy のインストール¶
Snowflake SQLAlchemy パッケージは、 pip を使用してパブリック PyPI リポジトリからインストールできます。
pip は、Python用Snowflakeコネクタを含むすべての必要なモジュールを自動的にインストールします。
開発者ノートは、ソースコード GitHub にホストされていることに注意してください。
インストールの確認¶
次のPythonサンプルコードを含むファイル(例:
validate.py)を作成します。これは、Snowflakeに接続し、Snowflakeバージョンを表示します。<ユーザーログイン名>、<パスワード>、および<アカウント識別子>をSnowflakeアカウントおよびユーザーの適切な値に置き換えます。詳細については、 接続パラメーター (このトピック内)をご参照ください。サンプルコードを実行します。例えば、
validate.pyという名前のファイルを作成した場合、
Snowflakeバージョン(例: 1.6.0)が表示されます。
Snowflake固有のパラメーターと動作¶
Snowflake SQLAlchemy は、可能な限り、 SQLAlchemy アプリケーションに互換性のある機能を提供します。
SQLAlchemy の使用については、 SQLAlchemy のドキュメントをご参照ください。
ただし、Snowflake SQLAlchemy はSnowflake固有のパラメーターと動作も提供します。これについては、次のセクションで説明します。
接続パラメーター¶
必須パラメーター¶
Snowflake SQLAlchemy は、次の接続文字列構文を使用してSnowflakeに接続し、セッションを開始します:
条件:
<ユーザーログイン名>は、Snowflakeユーザーのログイン名。<パスワード>は、Snowflakeユーザーのパスワード。<アカウント識別子>は、使用するアカウント識別子です。 Snowflakeに接続するためのクライアント、ドライバー、ライブラリ、またはサードパーティアプリケーションの構成 をご参照ください。注釈
使用するアカウント識別子の一部に、
snowflakecomputing.comドメイン名を 含めない でください。Snowflakeは、使用するアカウント識別子にドメイン名を自動的に追加して、必要な接続を作成します。
追加の接続パラメーター¶
オプションで、接続文字列の最後( <アカウント名> の後)に、次の追加情報を含めることができます。
条件:
<データベース名>および<スキーマ名>は、スラッシュ(/)で区切られたSnowflakeセッションの初期データベースとスキーマです。warehouse=<ウェアハウス名>およびrole=<ロール名>'はセッションの初期ウェアハウスおよびロールであり、パラメーター文字列として指定され、疑問符(?)で区切られています。
注釈
ログイン後、接続文字列で指定された初期データベース、スキーマ、ウェアハウス、およびロールは、セッションに対していつでも変更できます。
プロキシサーバーの構成¶
プロキシサーバーのパラメーターはサポートされていません。代わりに、サポートされている環境変数を使用してプロキシサーバーを構成します。詳細については、 プロキシサーバーの使用 をご参照ください。
接続文字列の例¶
次の例では、ユーザー名 testuser1、パスワード 0123456、アカウント識別子 myorganization-myaccount、データベース testdb、スキーマ public、ウェアハウス testwh、およびロール myrole で create_engine メソッドを呼び出します。
便宜上、 snowflake.sqlalchemy.URL メソッドを使用して接続文字列を作成し、データベースに接続できます。次の例では、前の例と同じ接続文字列を作成します。
接続の開始および終了¶
engine.connect() を実行して接続を開始します。 engine.execute() の使用は避けてください。
注釈
engine.dispose() の前に connection.close() を実行して、接続を終了してください。そうしない場合は、Python GarbageコレクターがSnowflakeとの通信に必要なリソースを削除するため、Pythonコネクタはセッションを適切に終了できなくなります。
明示的なトランザクションを使用する場合は、 SQLAlchemy 内の AUTOCOMMIT 実行オプションを無効にする必要があります。
詳細については、 SQLAlchemy <https://docs.sqlalchemy.org/en/14/core/connections.html#library-level-e-g-emulated-autocommit>`_ の `AUTOCOMMIT 実行オプションをご参照ください。
デフォルトでは、 SQLAlchemy はこのオプションを有効にします。このオプションを有効にすると、 INSERT、 UPDATE、および DELETE ステートメントは、明示的なトランザクション内で実行された場合でも、実行時に自動的にコミットされます。
AUTOCOMMIT を無効にするには、 autocommit=False を Connection.execution_options() メソッドに渡します。例:
自動インクリメントの動作¶
値を自動インクリメントするには、 Sequence オブジェクトが必要です。新しいレコードが挿入されるたびに値を自動的にインクリメントするには、主キー列に Sequence オブジェクトを含めます。例:
オブジェクト名の大文字小文字の処理¶
Snowflakeは、大文字と小文字を区別しないすべてのオブジェクト名を大文字で保存します。対照的に、 SQLAlchemy はすべての小文字のオブジェクト名が大文字と小文字を区別しないと見なします。Snowflake SQLAlchemy は、スキーマレベルの通信中(つまり、テーブルとインデックスのリフレクション中)に、オブジェクト名の大文字と小文字を変換します。大文字のオブジェクト名を使用する場合、 SQLAlchemy は大文字と小文字が区別されると想定し、名前を引用符で囲みます。この動作により、Snowflakeから受信したデータディクショナリデータとの不一致が発生するため、引用符(例: "TestDb")を使用して大文字と小文字を区別する識別子名を作成しない限り、SQLAlchemy 側では、すべて小文字の名前を使用する必要があります。
インデックスのサポート¶
インデックスは、Snowflake SqlAlchemy のハイブリッドテーブルでのみサポートされています。制限事項やユースケースの詳細については、 CREATE INDEX 使用上の注意 をリファレンスしてください。インデックスは以下の方法で作成できます。
単一列インデックス
列に
index=Trueパラメーターをセットするか、Indexオブジェクトを明示的に定義することで、単一の列インデックスを作成することができます。複数列インデックス
複数列インデックスの場合、インデックスされるべき列を指定するインデックスオブジェクトを定義します。
Numpyデータ型のサポート¶
Snowflake SQLAlchemy は、 NumPy データ型のバインドとフェッチをサポートしています。バインディングは常にサポートされています。 NumPy データ型のフェッチを有効にするには、接続パラメーターに numpy=True を追加します。
次の NumPy データ型がサポートされています。
numpy.int64numpy.float64numpy.datetime64
次の例は、 numpy.datetime64 データのラウンドトリップを示しています。
列メタデータのキャッシュ¶
SQLAlchemy はランタイム検査 API を提供して、さまざまなオブジェクトに関するランタイム情報を取得します。一般的な使用例の1つは、スキーマカタログを構築するために、スキーマ内のすべてのテーブルとその列メタデータを取得することです。
詳細については、 ランタイム検査 API をご参照ください。SQLAlchemy、 alembic を使用してデータベース スキーマの移行を管理する例。
擬似コードフローは次のとおりです:
このフローでは、潜在的な問題として、各テーブルでクエリを実行するのにかなり時間がかかることがあります。結果はキャッシュされますが、列のメタデータの取得には高額な費用がかかります。
この問題を軽減するために、Snowflake SQLAlchemy はフラグ cache_column_metadata=True を取り、 get_table_names が呼び出されたときにすべてのテーブルのすべての列メタデータがキャッシュされ、残りの get_columns、 get_primary_keys および get_foreign_keys がキャッシュを利用できるようにします。
注釈
すべての列メタデータが Inspector オブジェクトに関連付けられてキャッシュされるため、メモリ使用量が増加します。すべての列メタデータを取得する必要がある場合にのみ、フラグを使用します。
VARIANT 、ARRAY、および OBJECT のサポート¶
Snowflake SQLAlchemy は、 VARIANT、 ARRAY、および OBJECT データ型の取得をサポートしています。すべての型はPythonで str に変換されるため、 json.loads を使用してネイティブデータ型に変換できます。
この例は、 VARIANT、 ARRAY、および OBJECT データ型の列を含むテーブルを作成する方法を示しています。
VARIANT、 ARRAY、および OBJECT データ型の列を取得してネイティブPythonデータ型に変換するには、次のようにデータを取得して json.loads メソッドを呼び出します。
構造化データ型のサポート¶
このモジュールは、Snowflake 構造化データ、特に Iceberg テーブル用のカスタム SQLAlchemy タイプを定義します。MAP、 OBJECT、 ARRAY のタイプでは、 SQLAlchemy モデルに複雑なデータ構造を格納することができます。詳細情報については、Snowflake Structured data types ドキュメントを参照してください。
MAP¶
MAP タイプはキーと値のペアの集まりを表し、キーと値はそれぞれ異なるタイプを持つことができます。
キーのタイプ:
TEXTやNUMBERのようなキーのタイプ。値のタイプ:
TEXTやNUMBERのような値のタイプ。Not Null: NULL 値を許可するかどうか (デフォルト値は
False)。
使用例:
OBJECT¶
OBJECT タイプは、名前付きフィールドを持つ半構造化オブジェクトを表します。各フィールドは特定のタイプを持つことができ、各フィールドがNULL許容かどうかを指定することもできます。
アイテムのタイプ: フィールド名とそのタイプの辞書。このタイプには、オプションでNull許容 フラグ(Null許容でない場合は
True、Null許容の場合はFalse[デフォルト])を含めることができます。
使用例:
ARRAY¶
ARRAY タイプは値の順序付きリストを表し、各要素は同じタイプを持ちます。要素のタイプは配列の作成時に定義されます。
値のタイプ:
TEXTやNUMBERのような配列の要素のタイプ。Not Null:
NULLの値を許可するかどうか(デフォルト値はFalse)。
使用例:
CLUSTER BY のサポート¶
Snowflake SQLAlchemy は、テーブルの CLUSTER BY パラメーターをサポートしています。パラメーターの詳細については、 CREATE TABLE をご参照ください。
この例では、クラスタリングキーとして id と name の2つの列を持つテーブルを作成する方法を示します。
Alembicのサポート¶
Alembicは、 SQLAlchemy の上にあるデータベース移行ツールです。Snowflake SQLAlchemy は、AlembicがSnowflake SQLAlchemy を認識できるように、次のコードを alembic/env.py に追加することで機能します。
一般的な使用法については、 Alembicドキュメント をご参照ください。
キーペア認証のサポート¶
Snowflake SQLAlchemy は、Python用Snowflakeコネクタの機能を利用してキーペア認証をサポートします。秘密キーと公開キーを作成するステップについては、 キーペア認証とキーペアローテーションの使用 をご参照ください。
秘密キーパラメーターは、次のように connect_args を介して渡されます。
PRIVATE_KEY_PASSPHRASE は、秘密キーファイル rsa_key.p8 を復号化するためのパスフレーズです。
snowflake.sqlalchemy.URL メソッドは秘密キーパラメーターをサポートしていません。
マージコマンドのサポート¶
Snowflake SQLAlchemy は、その MergeInto カスタム式によるアップサートの実行をサポートしています。包括的なドキュメントについては、 MERGE をご参照ください。
次のように使用します。
CopyIntoStorage のサポート¶
Snowflake SQLAlchemy は、カスタム CopyIntoStorage 式を使用して、テーブルとクエリ結果をさまざまなSnowflakeステージ、Azureコンテナー、および AWS バケットに保存することをサポートしています。包括的なドキュメントについては、 COPY INTO <場所> をご参照ください。
次のように使用します。
IcebergテーブルとSnowflakeカタログサポート¶
Snowflake SQLAlchemy は、さまざまな関連パラメーターとともに、Snowflake カタログでアイスバーグテーブルをサポートしています。Icebergテーブルの詳細情報については、Snowflake CREATEICEBERG ドキュメントを参照してください。
Snowflake SQLAlchemy を使用して Iceberg テーブルを作成するには、 SQLAlchemy Core 構文を使用して、以下のようにテーブルを定義します。
あるいは、宣言的アプローチを使ってテーブルを定義することもできます。
ハイブリッドテーブル対応¶
Snowflake SQLAlchemy はインデックス付きのハイブリッドテーブルをサポートしています。詳細情報については、Snowflake CREATE HYBRID TABLE ドキュメントを参照してください。
ハイブリッド・テーブルを作成し、インデックスを追加するには、 SQLAlchemy Core構文を次のように使用します。
あるいは、宣言的アプローチを使ってテーブルを定義することもできます。
動的テーブルは、サポートします。¶
Snowflake SQLAlchemy はダイナミックテーブルをサポートしています。詳細情報については、Snowflake CREATE DYNAMIC TABLE ドキュメントを参照してください。
ダイナミック・テーブルを作成するには、 SQLAlchemy Core の構文を次のように使用します。
さらに、 SqlAlchemy select() 構文を使用して、列のないテーブルを定義することもできます。
注釈
ダイナミックテーブルのプライマリキーはサポートされていますう。つまり、宣言型テーブルはダイナミック・テーブルをサポートしていません。
as_queryパラメーターを文字列で使用する場合、列を明示的に定義する必要があります。しかし、SQLAlchemyselect()構文を使う場合、列を明示的に定義する必要はありません。ダイナミック・テーブルへの直接データ挿入はサポートされていません。