Pythonコネクタ API¶
Snowflake Connector for Pythonは、Pythonデータベース API v2.0仕様(PEP-249 )を実装しています。このトピックでは、標準の API およびSnowflake固有の拡張機能について説明します。
詳細については、 PEP-249 ドキュメントをご参照ください。
このトピックの内容:
モジュール: snowflake.connector¶
メインモジュールは snowflake.connector で、 Connection オブジェクトを作成し、 Error クラスを提供します。
定数¶
- apilevel¶
サポートされている API レベルを示す文字列定数。コネクタは API
"2.0"をサポートします。
- threadsafety¶
インターフェイスがサポートするスレッドセーフティのレベルを示す整数定数。Python用Snowflakeコネクタは、レベル
2をサポートします。これは、スレッドがモジュールと接続を共有できることを示しています。
- paramstyle¶
インターフェイスで予期されるパラメーターマーカーの形式の型を示す文字列定数。コネクタはデフォルトで
"pyformat"型をサポートします。これはPython拡張フォーマットコード(例:...WHERE name=%sまたは...WHERE name=%(name)s)に適用されます。Connection.connectはparamstyleを上書きして、バインド変数の形式を"qmark"または"numeric"に変更できます。変数はそれぞれ?または:Nです。例:
format: .execute("... WHERE my_column = %s", (value,)) pyformat: .execute("... WHERE my_column = %(name)s", {"name": value}) qmark: .execute("... WHERE my_column = ?", (value,)) numeric: .execute("... WHERE my_column = :1", (value,))
注釈
バインド変数は、
paramstyleが"pyformat"または"format"の場合はクライアント側で発生し、"qmark"または"numeric"の場合はサーバー側で発生します。現在、コネクタは複数の実行の後に続く SQL テキストのコンパイルをサポートしていないため、パフォーマンスまたは機能の点でこれらのオプションに大きな違いはありません。代わりに、"qmark"および"numeric"オプションは、他のドライバーのクエリテキストの互換性と一致します(つまり、 JDBC、 ODBC、Go Snowflake Driver)、変数形式?または:Nのサーバー側バインドをサポートします。
関数¶
- connect(parameters...)¶
- 目的:
データベースへの接続を作成するためのコンストラクター。
Connectionオブジェクトを返します。デフォルトでは、自動コミットモードは 有効 です(つまり、接続を閉じると、すべての変更がコミットされる)。トランザクションが必要な場合は、 BEGIN コマンドを使用してトランザクションを開始し、 COMMIT または ROLLBACK を使用して変更をコミットまたはロールバックします。
- パラメーター:
有効な入力パラメーターは次のとおりです。
パラメーター
必須
説明
account有り
使用するアカウント識別子。アカウント識別子には
snowflakecomputing.comサフィックスが含まれて いません。. . 詳細と例については、 使用上の注意 (このトピック内)をご参照ください。user有り
ユーザーのログイン名。
password有り
ユーザーのパスワード。
application接続を行うアプリケーションを識別する名前。
region非推奨 このパラメーターの説明は後方互換性のためのものです。
hostホスト名。
portポート番号 (デフォルトでは
443)。database使用するデフォルトのデータベースの名前。ログイン後、 USE DATABASE を使用してデータベースを変更できます。
schemaデータベースに使用するデフォルトのスキーマの名前。ログイン後、 USE SCHEMA を使用してスキーマを変更できます。
role使用する既定のロールの名前。ログイン後、 USE ROLE を使用してロールを変更できます。
warehouse使用するデフォルトのウェアハウスの名前。ログイン後、 USE WAREHOUSE を使用してウェアハウスを変更できます。
passcode_in_passwordデフォルトでは、
False。ログインパスワードに MFA (多要素認証)パスコードが埋め込まれている場合は、Trueに設定します。passcodeログインで MFA (多要素認証)を使用するときにDuoによって提供されるパスコード。
private_key認証に使用される秘密キー。詳細については、 キーペア認証とキーペアローテーションの使用 をご参照ください。
private_key_file指定したユーザーの秘密キーファイルへのパスを指定します。キーペア認証とキーペアローテーションの使用 をご参照ください。
private_key_file_pwd指定されたユーザーの秘密キーファイルを復号化するためのパスフレーズを指定します。キーペア認証とキーペアローテーションの使用 をご参照ください。
autocommitデフォルトでは
None。Snowflakeパラメーター AUTOCOMMIT が優先されます。セッションで自動コミットモードを有効または無効にするには、それぞれTrueまたはFalseに設定します。client_fetch_use_mpTrueに設定した場合、複数処理のフェッチが可能になり、多くの場合でフェッチの時間が短縮されるはずです。デフォルト:False。client_prefetch_threads結果セットのダウンロードに使用されるスレッドの数(デフォルトでは
4)。値を大きくするとフェッチのパフォーマンスは向上しますが、より多くのメモリが必要になります。client_session_keep_aliveセッションを無期限に(ユーザーからのアクティビティがない場合でも)アクティブに保つには、これを
Trueに設定します。これをTrueに設定する場合は、closeメソッドを呼び出してスレッドを適切に終了してください。そうしないと、プロセスがハングする可能性があります。デフォルト値は、使用しているコネクタのバージョンによって異なります。バージョン2.4.6以降: デフォルトでは
None。. 値がNoneの場合は、 CLIENT_SESSION_KEEP_ALIVE セッションパラメーターが優先されます。. . セッションパラメーターを上書きするには、この引数にTrueまたはFalseを渡します。バージョン2.4.5以前: デフォルトで
Falseです。. 値がFalseの場合(明示的に指定するか、引数を省略した場合)、 CLIENT_SESSION_KEEP_ALIVE セッションパラメーターが優先されます。. .
connectメソッドにclient_session_keep_alive=Falseを渡しても、CLIENT_SESSION_KEEP_ALIVEセッションパラメーターの値TRUEは上書き されません。login_timeoutログイン用秒単位のタイムアウト。デフォルトでは、60秒。HTTP 応答が「成功」の場合、タイムアウトの長さの後にログインリクエストは放棄されます。
network_timeout他のすべての操作のタイムアウト(秒)。デフォルトでは、なし/無限。HTTP 応答が「成功」ではない場合、一般的なリクエストは、タイムアウトの長さの後に放棄されます。
ocsp_response_cache_filenameURI OCSP 応答キャッシュファイル用。デフォルトでは、 OCSP 応答キャッシュファイルはキャッシュディレクトリに作成されます。
Linux:
~/.cache/snowflake/ocsp_response_cachemacOS:
~/Library/Caches/Snowflake/ocsp_response_cacheWindows:
%USERPROFILE%AppDataLocalSnowflakeCachesocsp_response_cache
別のディレクトリでファイルを見つけるには、 URI でパスとファイル名を指定します(例:
file:///tmp/my_ocsp_response_cache.txt)。authenticatorSnowflakeの認証方式:
snowflake(デフォルト)は、内部Snowflake認証方式を使用します。externalbrowserは、ウェブブラウザーとOkta、AD FS、またはアカウントに定義されている他の SAML 2.0準拠のIDプロバイダー(IdP)を使用して認証します。https://<Oktaのアカウント名>.okta.com(つまり、OktaのURLエンドポイント)でネイティブOktaを介して認証します。OAuthを使用して認証する
oauth。また、tokenパラメーターを指定して、その値を OAuth アクセストークンに設定する必要があります。username_password_mfaは MFA トークンキャッシングで認証します。詳細については、 MFA トークンキャッシングを使用して認証中のプロンプトの数を最小限に抑える --- オプション をご参照ください。OAuth 2.0認証コードフローを使用する場合は
OAUTH_AUTHORIZATION_CODE。OAuth 2.0クライアント認証情報フローを使用する場合は
OAUTH_CLIENT_CREDENTIALS。WORKLOAD_IDENTITYは、 ワークロードIDフェデレーション(WIF) 認証コードを使用して認証します。
値が
snowflakeでない場合、ユーザーとパスワードのパラメーターは IdP のログイン認証情報である必要があります。validate_default_parametersデフォルトでは、
False。Trueの場合、指定されたデータベース、スキーマ、またはウェアハウスのいずれかが存在しない場合、例外を発生させます。
無効な引数名または間違ったデータ型の引数値が渡された場合は、stderrに警告を出力します。
paramstylepyformatクライアント側のバインドのデフォルト。サーバー側バインドのバインド変数形式を変更するには、qmarkまたはnumericを指定します。timezoneデフォルトでは、
None。Snowflakeパラメーター TIMEZONE が優先されます。有効なタイムゾーン(例:America/Los_Angeles)に設定して、セッションのタイムゾーンを設定します。arrow_number_to_decimalデフォルトでは
Falseで、これは NUMBER 列の値が倍精度浮動小数点数(float64)として返されることを意味します。. . これをTrueに設定すると、fetch_pandas_all()メソッドおよびfetch_pandas_batches()メソッドを呼び出すときに、 DECIMAL 列の値が10進数(decimal.Decimal)として返されます。. . このパラメーターは、Python用Snowflakeコネクタのバージョン2.4.3で導入されました。socket_timeoutソケットレベルの読み込みと接続リクエストのタイムアウト時間(秒単位)。詳細については、 接続タイムアウトの管理 をご参照ください。
backoff_policy再試行までの待ち時間を定義するジェネレーター関数の名前。詳細については、 再試行のための接続バックオフポリシーの管理 をご参照ください。
enable_connection_diag接続性診断レポートを作成するかどうか。デフォルトは
Falseです。connection_diag_log_path診断レポートの場所の絶対パス。
enable_connection_diagがTrueの場合のみ使用されます。Defaultは、お使いのオペレーティング・システムのデフォルトの一時ディレクトリで、LinuxやMacでは/tmpです。connection_diag_allowlist_pathSYSTEM$ALLOWLIST()またはSYSTEM$ALLOWLIST_PRIVATELINK()の出力を含む JSON ファイルへの絶対パス。接続で定義されたユーザーがシステム許可リスト関数を実行する権限を持っていない場合、またはアカウント URL への接続に失敗した場合にのみ必要です。iobound_tpe_limitpreprocess_tpeおよびpostprocessスレッドプール実行部のサイズ (TPEs)。デフォルト値は、ファイル数と CPU コア数のうち小さい方の値です。
unsafe_file_writeGET コマンドを使用して、ステージからダウンロードされたファイルにどのファイルアクセス権を割り当てるかを指定をします。
False(デフォルト)は、所有者だけがファイルにアクセスできる権限を600に設定します。Trueは、ファイルのアクセス権を644に設定し、所有者には読み取りと書き込みの権限を付与し、それ以外には読み取り専用の権限を付与します。詳細については、 データのダウンロード をご参照ください。oauth_client_idSnowflake統合用にIDプロバイダーが提供する
client idの値(Snowflakeセキュリティ統合メタデータ)。oauth_client_secretIDプロバイダーがSnowflake統合用に提供する
client secretの値(Snowflakeセキュリティ統合メタデータ)。oauth_authorization_url認証コードをドライバーに提供する ID プロバイダーエンドポイント。SnowflakeをIDプロバイダーとして使用する場合、この値は
serverまたはaccountパラメーターから取得されます。oauth_token_request_urlドライバーにアクセストークンを供給する ID プロバイダーのエンドポイント。SnowflakeをIDプロバイダーとして使用する場合、この値は
serverまたはaccountパラメーターから取得されます。oauth_scopeID プロバイダー承認リクエストで要求された範囲。デフォルトでは、ロールから派生します。複数のスコープが必要な場合、値はスペースで区切られた複数のスコープのリストでなければなりません。
oauth_redirect_uri認証コードリダイレクトに使用する URI (Snowflakeセキュリティ統合メタデータ)。デフォルト:
http://127.0.0.1:{randomAvailablePort}。oauth_disable_pkceProof Key for Code Exchange (PKCE) を無効にします。これは、悪意のある攻撃者が認証コードを傍受しても、有効なアクセストークンに変更できないようにするセキュリティ機能です。
oauth_enable_refresh_token実際のアクセストークンが古くなったときに、サイレント再認証を有効にします。認証サーバーによってサポートされ、
client_store_temporary_credentialがTrueに設定されている必要があります。oauth_enable_single_use_refresh_tokensシングルユース・更新・トークンのセマンティクスにオプトインするかどうか。
workload_identity_providerワークロードIDプロバイダーのプラットフォーム。可能な値は次のとおりです。
AWS、AZURE、GCPおよび:codenowrap:OIDC。
属性¶
- Error, Warning, ...
Pythonデータベース API 標準で定義されているすべての例外クラス。Python用Snowflakeコネクタは、属性
msg、errno、sqlstate、sfqid、およびraw_msgを提供します。
account パラメーターの使用上の注意(connect メソッドの場合)¶
必須 account パラメーターには、使用する アカウント識別子 を指定します。
アカウント識別子には snowflakecomputing.com ドメイン名が含まれて いない ことに注意してください。Snowflakeは、接続の作成時にこれを自動的に追加します。
次の例では、 アカウント名を、組織 myorganization 内のアカウント myaccount の識別子 として使用しています。
ctx = snowflake.connector.connect(
user='<user_name>',
password='<password>',
account='myorganization-myaccount',
... )
次の例では、アカウント識別子として アカウントロケーター xy12345 を使用しています。
ctx = snowflake.connector.connect(
user='<user_name>',
password='<password>',
account='xy12345',
... )
この例では、 AWS US 西部(オレゴン)リージョンのアカウントを使用しています。アカウントが別のリージョンにある場合、またはアカウントが別のクラウドプロバイダーを使用している場合は、 アカウントロケーターの後に追加のセグメントを指定する 必要があります。
オブジェクト: Connection¶
Connection オブジェクトは、データベース接続をアクティブに保つための接続およびセッション情報を保持します。閉じた場合、またはセッションの有効期限が切れた場合、後続の操作は失敗します。
メソッド¶
- autocommit(True|False)¶
- 目的:
自動コミットモードを有効または無効にします。デフォルトでは、自動コミットは有効になっています(
True)。
- close()¶
- 目的:
接続を閉じます。接続を閉じたときにトランザクションがまだ開いている場合、変更は ロールバック されます。
接続を閉じると、サーバーからアクティブなセッションが明示的に削除されます。そうでない場合、アクティブセッションは最終的にサーバーから削除されるまで継続し、同時クエリの数が制限されます。
例:
# context manager ensures the connection is closed with snowflake.connector.connect(...) as con: con.cursor().execute(...) # try & finally to ensure the connection is closed. con = snowflake.connector.connect(...) try: con.cursor().execute(...) finally: con.close()
- commit()¶
- 目的:
自動コミットが無効になっている場合、現在のトランザクションをコミットします。自動コミットが有効になっている場合、このメソッドは無視されます。
- rollback()¶
- 目的:
自動コミットが無効になっている場合、現在のトランザクションをロールバックします。自動コミットが有効になっている場合、このメソッドは無視されます。
- cursor()¶
- 目的:
Cursorオブジェクトを作成するためのコンストラクター。fetch*()呼び出しからの戻り値は、単一のシーケンスまたはシーケンスのリストになります。
- cursor(snowflake.connector.DictCursor)
- 目的:
DictCursorオブジェクトを作成するためのコンストラクター。fetch*()呼び出しからの戻り値は、単一のディクショナリまたはディクショナリオブジェクトのリストです。これは、結果から列名で値をフェッチするのに便利です。
- execute_string(sql_text, remove_comments=False, return_cursors=True)¶
- 目的:
文字列として渡された1つ以上の SQL ステートメントを実行します。
remove_commentsがTrueに設定されている場合、コメントはクエリから削除されます。return_cursorsがTrueに設定されている場合、このメソッドは実行順にCursorオブジェクトのシーケンスを返します。- 例:
この例では、単一の文字列で複数のコマンドを実行し、返されるカーソルのシーケンスを使用しています。
cursor_list = connection1.execute_string( "SELECT * FROM testtable WHERE col1 LIKE 'T%';" "SELECT * FROM testtable WHERE col2 LIKE 'A%';" ) for cursor in cursor_list: for row in cursor: print(row[0], row[1])
注釈
1つの文字列で複数の SQL ステートメントを許可する
execute_string()などのメソッドは、 SQL インジェクション攻撃に対して脆弱です。 ユーザーデータが検証されている場合を除き、文字列の連結やPythonのformat()関数といった関数の使用による、 SQL とユーザーのデータを組み合わせた SQL ステートメントの動的作成は避けてください。以下の例で問題を示します。# "Binding" data via the format() function (UNSAFE EXAMPLE) value1_from_user = "'ok3'); DELETE FROM testtable WHERE col1 = 'ok1'; select pi(" sql_cmd = "insert into testtable(col1) values('ok1'); " \ "insert into testtable(col1) values('ok2'); " \ "insert into testtable(col1) values({col1});".format(col1=value1_from_user) # Show what SQL Injection can do to a composed statement. print(sql_cmd) connection1.execute_string(sql_cmd)
動的に構成されたステートメントは次のようになります(読みやすくするために改行を追加)。
insert into testtable(col1) values('ok1'); insert into testtable(col1) values('ok2'); insert into testtable(col1) values('ok3'); DELETE FROM testtable WHERE col1 = 'ok1'; select pi();
信頼できないユーザーが入力した文字列の SQL ステートメントを組み合わせる場合、文字列を作成するよりもデータをステートメントにバインドする方が安全です。
execute_string()メソッドはバインドパラメーターを受け取らないため、パラメーターをバインドするにはCursor.execute()またはCursor.executemany()を使用します。
- execute_stream(sql_stream, remove_comments=False)¶
- 目的:
ストリームオブジェクトとして渡された1つ以上の SQL ステートメントを実行します。
remove_commentsがTrueに設定されている場合、コメントはクエリから削除されます。このジェネレーターは、 SQL ステートメントの実行時に各Cursorオブジェクトを生成します。sql_streamがコメント行で終わる場合は、remove_commentsをTrueに設定する必要があります。sql_script = """ -- This is first comment line; select 1; select 2; -- This is comment in middle; -- With some extra comment lines; select 3; -- This is the end with last line comment; """ sql_stream = StringIO(sql_script) with con.cursor() as cur: for result_cursor in con.execute_stream(sql_stream,remove_comments=True): for result in result_cursor: print(f"Result: {result}")
- get_query_status(query_id)¶
- 目的:
クエリのステータスを返します。
- パラメーター:
query_idクエリの ID。Snowflakeクエリ ID の取得 をご参照ください。
- 戻り値:
クエリのステータスを表す
QueryStatusオブジェクトを返します。- 例:
クエリのステータスの確認 をご参照ください。
- get_query_status_throw_if_error(query_id)¶
- 目的:
クエリのステータスを返します。クエリの結果がエラーの場合、このメソッドは
ProgrammingErrorを発生します(execute()メソッドの場合と同様)。- パラメーター:
query_idクエリの ID。Snowflakeクエリ ID の取得 をご参照ください。
- 戻り値:
クエリのステータスを表す
QueryStatusオブジェクトを返します。- 例:
クエリのステータスの確認 をご参照ください。
- is_valid()¶
- 目的:
接続がクエリを受信できるほど安定している場合は
Trueを返します。
- is_still_running(query_status)¶
- 目的:
クエリステータスがクエリがまだ完了していないか、まだ処理中であることを示している場合は、
Trueを返します。- パラメーター:
query_statusクエリのステータスを表す
QueryStatusオブジェクト。クエリ用にこのオブジェクトを取得するには、 クエリのステータスの確認 をご参照ください。- 例:
クエリのステータスの確認 をご参照ください。
- is_an_error(query_status)¶
- 目的:
クエリステータスがクエリでエラーが発生したことを示している場合は、
Trueを返します。- パラメーター:
query_statusクエリのステータスを表す
QueryStatusオブジェクト。クエリ用にこのオブジェクトを取得するには、 クエリのステータスの確認 をご参照ください。- 例:
クエリのステータスの確認 をご参照ください。
属性¶
- expired¶
接続のマスタートークンの有効期限が切れているかどうかを追跡します。
- messages¶
この接続の基礎となるデータベースから受信したすべてのメッセージのシーケンス(例外クラス、例外値)を含むリストオブジェクト。
リストは、メソッドの呼び出しによって自動的にクリアされます。
- errorhandler¶
エラー条件が満たされた場合に呼び出すエラーハンドラーを参照する読み取り/書き込み属性。
ハンドラーは、次の引数を受け入れるPython呼び出し可能ハンドラーでなければなりません。
errorhandler(connection, cursor, errorclass, errorvalue)
- Error, Warning, ...
Pythonデータベース API 標準で定義されているすべての例外クラス。
オブジェクト: Cursor¶
Cursor オブジェクトは、実行およびフェッチ操作のデータベースカーソルを表します。各カーソルには description と rowcount の独自の属性があり、カーソルが分離されます。
メソッド¶
- close()
- 目的:
カーソルオブジェクトを閉じます。
- describe(command [, parameters][, timeout][, file_stream])¶
- 目的:
データベースコマンドを実行 することなく、結果セットに関するメタデータを返します。これにより、クエリの実行後に
description属性で使用できるものと同じメタデータが返されます。このメソッドは、Python用Snowflakeコネクタのバージョン2.4.6で導入されました。
- パラメーター:
execute()メソッドのパラメーターをご参照ください。- 戻り値:
結果セットの列を説明する ResultMetadata オブジェクトのリストを返します。
- 例:
列のメタデータの取得 をご参照ください。
- execute(command [, parameters][, timeout][, file_stream])¶
- 目的:
データベースコマンドを準備して実行します。
- パラメーター:
command実行する SQL ステートメントを含む文字列。
parameters(オプション) SQL ステートメントで バインドデータ にパラメーターを使用した場合は、これらのパラメーターにバインドする必要がある変数のリストまたはディクショナリにこれを設定します。
変数のPythonデータ型を対応する列の SQL データ型にマッピングする方法の詳細については、 qmark および numeric バインドのデータ型マッピング をご参照ください。
timeout(オプション)クエリが完了するのを待機する秒数。この時間が経過してもクエリが完了しない場合は、クエリを中止する必要があります。
file_stream(オプション) PUT コマンドを実行する場合は、このパラメーターを使用して、ファイルシステム上のファイルではなく、メモリ内のファイルのようなオブジェクト(例:Python
open()関数から返されたI/Oオブジェクト)をアップロードできます。このパラメーターをそのI/Oオブジェクトに設定します。PUT コマンドでデータファイルに URI を指定する場合、
任意のディレクトリパスを使用できます。URI で指定したディレクトリパスは無視されます。
ファイル名には、ステージ上に作成するファイルの名前を指定します。
たとえば、ファイルストリームから次の名前のファイルにファイルをアップロードするには、
@mystage/myfile.csv
次の呼び出しを使用します。
cursor.execute( "PUT file://this_directory_path/is_ignored/myfile.csv @mystage", file_stream=<io_object>)
- 戻り値:
Cursorオブジェクトの参照を返す。
- executemany(command, seq_of_parameters)¶
- 目的:
データベースコマンドを準備し、これを
seq_of_parametersで見つかったすべてのパラメーターシーケンスに対して実行する。このメソッドは、 バッチ挿入操作の実行 に使用できます。- パラメーター:
commandコマンドは、実行するコードを含む文字列です。文字列には、 データのバインド の1つ以上のプレースホルダー(疑問符など)を含める必要があります。
例:
"insert into testy (v1, v2) values (?, ?)"seq_of_parametersこれは、リストまたはタプルのシーケンス(リストまたはタプル)でなければなりません。シーケンスの例については、以下のサンプルコードをご参照ください。
- 戻り値:
Cursorオブジェクトの参照を返す。- 例:
# This example uses qmark (question mark) binding, so # you must configure the connector to use this binding style. from snowflake import connector connector.paramstyle='qmark' stmt1 = "create table testy (V1 varchar, V2 varchar)" cs.execute(stmt1) # A list of lists sequence_of_parameters1 = [ ['Smith', 'Ann'], ['Jones', 'Ed'] ] # A tuple of tuples sequence_of_parameters2 = ( ('Cho', 'Kim'), ('Cooper', 'Pat') ) stmt2 = "insert into testy (v1, v2) values (?, ?)" cs.executemany(stmt2, sequence_of_parameters1) cs.executemany(stmt2, sequence_of_parameters2)
内部的には、複数の
executeメソッドが呼び出され、最後のexecute呼び出しからの結果セットが残ります。注釈
executemanyメソッドは、単一のパラメーター化された SQL ステートメントを実行し、複数のバインド値を渡すためにのみ使用できます。1回の
execute呼び出しでセミコロンにより区切られた、複数の SQL ステートメントの実行はサポートされていません。代わりに、ステートメントごとに個別のexecute呼び出しを発行します。
- execute_async(...)¶
- fetch_arrow_all()¶
- 目的:
このメソッドは、カーソル内のすべての行をフェッチし、 PyArrow テーブルにロードします。
- パラメーター:
なし。
- 戻り値:
結果セットのすべての行を含む PyArrow テーブルを返します。
行がない場合は、Noneを返します。
- 例:
- fetch_arrow_batches()¶
- 目的:
このメソッドは、カーソル内の行のサブセットを取得し、 PyArrow テーブルに配信します。
- パラメーター:
なし。
- 戻り値:
結果セットの行のサブセットを含む PyArrow テーブルを返します。
取得する行がもうない場合はNoneを返します。
- 例:
- get_result_batches()¶
- 目的:
結果セットから行のサブセットをフェッチするために使用できる ResultBatch オブジェクトのリストを返します。
- パラメーター:
なし。
- 戻り値:
ResultBatch オブジェクトのリストを返します。クエリの実行が完了していない場合は、
Noneを返します。- 例:
- get_results_from_sfqid(query_id)¶
- 目的:
非同期クエリまたは以前に送信された同期クエリの結果を取得します。
- パラメーター:
query_idクエリの ID。Snowflakeクエリ ID の取得 をご参照ください。
- 例:
クエリ ID を使用したクエリの結果の取得 をご参照ください。
- fetchone()¶
- 目的:
クエリ結果セットの次の行をフェッチし、使用可能なデータがなくなったときに単一のシーケンス/ディクショナリまたは
Noneを返します。
- fetchmany([size=cursor.arraysize])¶
- 目的:
クエリ結果セットの次の行をフェッチし、シーケンス/ディクショナリのリストを返します。使用可能な行がなくなると、空のシーケンスが返されます。
- fetchall()¶
- 目的:
クエリ結果セットのすべてまたは残りの行をフェッチし、シーケンス/ディクショナリのリストを返します。
- fetch_pandas_all()¶
- 目的:
このメソッドは、カーソル内のすべての行をフェッチし、Pandas DataFrame にロードします。
- パラメーター:
なし。
- 戻り値:
結果セットのすべての行を含む DataFrame を返します。
Pandasデータフレームの詳細については、 Pandas DataFrame ドキュメントをご参照ください。
行がない場合は、
Noneを返します。
- 使用上の注意:
このメソッドは、Pandasの
read_sql()メソッドを完全に置き換えるものではありません。このメソッドは、 SELECT クエリからデータを取得し、Pandas DataFrame にデータを格納するための迅速な方法を提供します。現在、このメソッドは SELECT ステートメントに対してのみ機能します。
- 例:
ctx = snowflake.connector.connect( host=host, user=user, password=password, account=account, warehouse=warehouse, database=database, schema=schema, protocol='https', port=port) # Create a cursor object. cur = ctx.cursor() # Execute a statement that will generate a result set. sql = "select * from t" cur.execute(sql) # Fetch the result set from the cursor and deliver it as the pandas DataFrame. df = cur.fetch_pandas_all() # ...
- fetch_pandas_batches()¶
- 目的:
このメソッドは、カーソル内の行のサブセットを取得し、Pandas DataFrame に配信します。
- パラメーター:
なし。
- 戻り値:
結果セットの行のサブセットを含む DataFrame を返します。
Pandasデータフレームの詳細については、 Pandas DataFrame ドキュメントをご参照ください。
取得する行がもうない場合は
Noneを返します。
- 使用上の注意:
結果セット内の行数、さらにメソッド呼び出しで指定された行数に応じて、メソッドを複数回呼び出すことが必要になる場合があります。または、すべてが単一バッチに収まるときは、すべての行を返す場合があります。
このメソッドは、Pandasの
read_sql()メソッドを完全に置き換えるものではありません。このメソッドは、 SELECT クエリからデータを取得し、Pandas DataFrame にデータを格納するための迅速な方法を提供します。現在、このメソッドは SELECT ステートメントに対してのみ機能します。
- 例:
ctx = snowflake.connector.connect( host=host, user=user, password=password, account=account, warehouse=warehouse, database=database, schema=schema, protocol='https', port=port) # Create a cursor object. cur = ctx.cursor() # Execute a statement that will generate a result set. sql = "select * from t" cur.execute(sql) # Fetch the result set from the cursor and deliver it as the pandas DataFrame. for df in cur.fetch_pandas_batches(): my_dataframe_processing_function(df) # ...
- __iter__()¶
自己を返し、カーソルを反復プロトコルと互換にします。
属性¶
- description¶
結果セットの列に関するメタデータを返す読み取り専用属性。
この属性は、
execute()メソッドを呼び出してクエリを実行した後に設定されます。(バージョン2.4.6以降では、describe()メソッドを呼び出すことにより、クエリを実行せずにこのメタデータを取得できます。)この属性は、次のいずれかに設定されます。
バージョン2.4.5以前: この属性は、タプルのリストに設定されます。
バージョン2.4.6以降: この属性は、 ResultMetadata オブジェクトのリストに設定されます。
各タプルまたは
ResultMetadataオブジェクトには、結果セットの列を説明するメタデータが含まれています。メタデータには、インデックスによって、またはバージョン2.4.6以降ではResultMetadataオブジェクト属性によって、アクセスできます。値のインデックス
ResultMetadata 属性
説明
0name列名。
1type_code内部 型コード。
2display_size(使用されていない。internal_sizeと同じ。)
3internal_size内部データサイズ。
4precision数値データの精度。
5scale数値データのスケール。
6is_nullableTrue列に NULL 値が許可されている場合、またはFalse。この属性の取得例については、 列のメタデータの取得 をご参照ください。
- rowcount¶
最後に生成された
executeの行数を返す読み取り専用属性。executeが実行されていない場合の値は、-1またはNoneです。
- sfqid¶
最後に実行された
executeまたはexecute_asyncのSnowflakeクエリ ID を返す読み取り専用属性。
- arraysize¶
一度にフェッチする行数を
fetchmany()で指定する読み取り/書き込み属性。デフォルトは1で、一度に1行ずつフェッチします。
- connection¶
カーソルが作成された
Connectionオブジェクトへの参照を返す読み取り専用属性。
- messages
カーソルの基になるデータベースから受信したすべてのメッセージのシーケンス(例外クラス、例外値)を含むリストオブジェクト。
リストは、
fetch*()呼び出しを除くメソッド呼び出しによって自動的にクリアされます。
- errorhandler
エラー条件が満たされた場合に呼び出すエラーハンドラーを参照する読み取り/書き込み属性。
ハンドラーは、次の引数を受け入れるPython呼び出し可能ハンドラーでなければなりません。
errorhandler(connection, cursor, errorclass, errorvalue)
型コード¶
Cursor オブジェクトでは、 description 属性と description() メソッドが、結果セットで列を説明するタプルのリストを提供します(または、バージョン2.4.6以降では、 ResultMetadata オブジェクト)。
タプルでは、インデックス 1 の値(ResultMetadata オブジェクトの type_code 属性)は列のデータ型を表します。Python用Snowflakeコネクタは、次のマップを使用し、型コードに基づいて文字列表現を取得します。
type_code |
文字列表現 |
データ型 |
|---|---|---|
0 |
FIXED |
NUMBER/INT |
1 |
REAL |
REAL |
2 |
TEXT |
VARCHAR/STRING |
3 |
DATE |
DATE |
4 |
TIMESTAMP |
TIMESTAMP |
5 |
VARIANT |
VARIANT |
6 |
TIMESTAMP_LTZ |
TIMESTAMP_LTZ |
7 |
TIMESTAMP_TZ |
TIMESTAMP_TZ |
8 |
TIMESTAMP_NTZ |
TIMESTAMP_TZ |
9 |
OBJECT |
OBJECT |
10 |
ARRAY |
ARRAY |
11 |
BINARY |
BINARY |
12 |
TIME |
TIME |
13 |
BOOLEAN |
BOOLEAN |
14 |
GEOGRAPHY |
GEOGRAPHY |
15 |
GEOMETRY |
GEOMETRY |
16 |
VECTOR |
VECTOR |
qmark および numeric バインドのデータ型マッピング¶
paramstyle が "qmark" または "numeric" の場合、PythonからSnowflakeデータ型への次のデフォルトマッピングが使用されます。
Pythonのデータ型 |
Snowflakeのデータ型 |
|---|---|
|
NUMBER(38, 0) |
|
NUMBER(38, 0) |
|
NUMBER(38、 <スケール>) |
|
REAL |
|
TEXT |
|
TEXT |
|
BINARY |
|
BINARY |
|
BOOLEAN |
|
DATE |
|
TIME |
|
TIME |
|
TIMESTAMP_NTZ |
|
TIMESTAMP_NTZ |
別のSnowflakeタイプにマッピングする必要がある場合(例: datetime から TIMESTAMP_LTZ)、Snowflake データ型と値が続くタプルでSnowflakeデータ型を指定します。例については、 datetimeと TIMESTAMP のバインド をご参照ください。
オブジェクト: Exception¶
PEP-249は、エラーまたは警告が発生した場合にSnowflake Connector for Pythonが発生させる例外を定義します。アプリケーションはそれらを適切に処理し、コードの実行を継続するか停止するかを決定する必要があります。
詳細については、 PEP-249 ドキュメントをご参照ください。
メソッド¶
Exception オブジェクトに使用できるメソッドはありません。
属性¶
- errno¶
Snowflake DB エラーコード。
- msg¶
エラーコード、 SQL 状態コードおよびクエリ IDを含むエラーメッセージ。
- raw_msg¶
エラーメッセージ。エラーコードなし、 SQL 状態コードまたはクエリ ID は含まれています。
- sqlstate¶
ANSI 準拠の SQL 状態コード
- sfqid
Snowflakeクエリ ID。
オブジェクト ResultBatch¶
ResultBatch オブジェクトは、結果セット内の行のサブセットを取得する関数をカプセル化します。複数のワーカーまたはノードに結果をフェッチする作業を分散する には、 カーソル オブジェクトで get_result_batches() メソッドを呼び出して、 ResultBatch オブジェクトのリストを取得し、これらのオブジェクトを処理するために異なるワーカーまたはノードに配布します。
属性¶
rowcount¶
結果バッチ内の行数を返す読み取り専用属性。
compressed_size¶
結果バッチ内のデータサイズ(圧縮されている場合)を返す読み取り専用属性。
uncompressed_size¶
結果バッチ内のデータサイズ(非圧縮)を返す読み取り専用属性。
メソッド¶
- to_arrow()¶
- 目的:
このメソッドは、
ResultBatchオブジェクトの行を含む PyArrow テーブルを返します。- パラメーター:
なし。
- 戻り値:
ResultBatchオブジェクトの行を含む PyArrow テーブルを返します。行がない場合は、Noneを返します。
- to_pandas()¶
- 目的:
このメソッドは、
ResultBatchオブジェクトの行を含むPandas DataFrame を返します。- パラメーター:
なし。
- 戻り値:
ResultBatchオブジェクトの行を含むPandas DataFrame を返します。行がない場合は、空のPandas DataFrame を返します。
オブジェクト: ResultMetadata¶
ResultMetadata オブジェクトは、結果セットの列に関するメタデータを表します。これらのオブジェクトのリストは、 Cursor オブジェクトの description 属性と description メソッドによって返されます。
このオブジェクトは、Python用Snowflakeコネクタのバージョン2.4.6で導入されました。
メソッド¶
なし。
属性¶
- name¶
列の名前
- display_size¶
不使用。internal_sizeと同じ。
- internal_size¶
内部データサイズ。
- precision¶
数値データの精度。
- scale¶
数値データのスケール。
- is_nullable¶
True列に NULL 値が許可されている場合、またはFalse。
モジュール: snowflake.connector.constants¶
snowflake.connector.constants モジュールは、 API で使用する定数を定義します。
列挙型¶
- class QueryStatus¶
非同期クエリのステータスを表します。この列挙型には次の定数があります。
列挙型定数
説明
RUNNING
クエリはまだ実行中です。
ABORTING
クエリはサーバー側で中止されています。
SUCCESS
クエリは正常に終了しました。
FAILED_WITH_ERROR
クエリに失敗しました。
QUEUED
クエリは、通常、リソースを待機しているため、実行のキューに入れられています(つまり、まだ実行が開始されていません)。
DISCONNECTED
セッションの接続が切断されています。クエリの状態は間もなく「FAILED_WITH_ERROR」に変わります。
RESUMING_WAREHOUSE
ウェアハウスが起動しており、クエリはまだ実行されていません。
BLOCKED
ステートメントは、別のステートメントによって保持されているロックを待機しています。
NO_DATA
通常、ステートメントがまだ実行を開始していないため、ステートメントに関するデータはまだ利用できません。
モジュール: snowflake.connector.pandas_tools¶
snowflake.connector.pandas_tools モジュールは、Pandasデータ分析ライブラリを操作するための関数を提供します。
詳細については、 Pandasデータ分析ライブラリ ドキュメントをご参照ください。
関数¶
- write_pandas(parameters...)¶
- 目的:
Pandas DataFrame をSnowflakeデータベースのテーブルに書き込みます。
データをテーブルに書き込むために、関数はデータをParquetファイルに保存し、 PUT コマンドを使用してこれらのファイルを一時ステージにアップロードし、 COPY INTO <テーブル> コマンドを使用してデータをファイルからテーブルにコピーします。一部の関数パラメーターを使用して、
PUTおよびCOPY INTO <テーブル>ステートメントの実行方法を制御できます。- パラメーター:
有効な入力パラメーターは次のとおりです。
パラメーター
必須
説明
conn有り
Snowflakeデータベースへの接続を保持する
Connectionオブジェクト。df有り
テーブルにコピーされるデータを含む
pandas.DataFrameオブジェクト。table_name有り
データがコピーされるテーブルの名前。
databaseテーブルを含んでいるデータベースの名前。デフォルトでは、関数は、セッションで現在使用されているデータベースに書き込みます。ノート:このパラメーターを指定する場合は、
schemaパラメーターも指定する必要があります。schemaテーブルを含んでいるスキーマの名前。デフォルトでは、関数は、セッションで現在使用されているスキーマのテーブルに書き込みます。
bulk_upload_chunksこのパラメーターを:codenowrap:
Trueに設定すると、:codenowrap:write_pandas関数の動作が変更され、最初にすべてのデータチャンクをローカルディスクに書き込み、次にチャンクフォルダーのワイルドカードアップロードをステージに実行します。Falseに設定した場合(デフォルト)、チャンクは1つずつ保存、アップロード、削除されます。chunk_size一度に挿入する要素の数。デフォルトでは、関数はすべての要素を一度に1つのチャンクで挿入します。
compressionParquetファイルに使用する圧縮アルゴリズム。圧縮率を上げるには
"gzip"を指定し、圧縮速度を上げるには"snappy"を指定します。デフォルトでは、関数は"gzip"を使用します。on_errorエラーの処理方法を指定します。これを
ON_ERRORコピーオプション に記載されている文字列値のいずれかに設定します。デフォルトでは、関数は"ABORT_STATEMENT"を使用します。parallelParquetファイルを一時ステージにアップロードする時に使用するスレッドの数。使用されるデフォルトのスレッド数とスレッド数の選択に関するガイドラインについては、 PUT コマンドの並列パラメーター をご参照ください。
quote_identifiersFalse場合は、識別子をサーバーに送信する前にコネクタが 識別子を二重引用符で囲む ことを防ぎます。デフォルトでは、コネクタは識別子を二重引用符で囲みます。- 戻り値:
(success, num_chunks, num_rows, output)のタプルを返します。関数がテーブルにデータを正常に書き込んだ場合、
successは、Trueです。num_chunksは、関数がコピーしたデータのチャンクの数です。num_rowsは、関数が挿入した行の数です。outputは、COPY INTO <テーブル>コマンドの出力です。
- 例:
次の例では、Pandas DataFrame のデータを「顧客」という名前のテーブルに書き込みます。
import pandas from snowflake.connector.pandas_tools import write_pandas # Create the connection to the Snowflake database. cnx = snowflake.connector.connect(...) # Create a DataFrame containing data about customers df = pandas.DataFrame([('Mark', 10), ('Luke', 20)], columns=['name', 'balance']) # Write the data from the DataFrame to the table named "customers". success, nchunks, nrows, _ = write_pandas(cnx, df, 'customers')
- pd_writer(parameters...)¶
- 目的:
pd_writerは、Snowflakeデータベースにデータを挿入するための挿入メソッドです。pandas.DataFrame.to_sqlを呼び出す時は、method=pd_writerを渡し、データを挿入するメソッドとしてpd_writerを使用することを指定します。(独自のコードからpd_writerを呼び出す必要はありません。to_sqlメソッドがpd_writerを呼び出し、必要な入力パラメーターを提供します。)詳細については、次をご参照ください。
注釈
pandas
DataFrameの列名に小文字しか含まれていない場合は、列名を二重引用符で囲む必要があることに注意してください。そうしないと、コネクタはProgrammingErrorを発生します。snowflake-sqlalchemyライブラリはテーブルを作成する際に小文字の列名を引用符で囲みませんが、pd_writerはデフォルトで列名を引用符で囲みます。この問題は、 COPY INTO コマンドでは列名を引用符で囲むことを想定しているために発生します。今後の改善は
snowflake-sqlalchemyライブラリで行われる予定です。例:
import pandas as pd from snowflake.connector.pandas_tools import pd_writer sf_connector_version_df = pd.DataFrame([('snowflake-connector-python', '1.0')], columns=['NAME', 'NEWEST_VERSION']) # Specify that the to_sql method should use the pd_writer function # to write the data from the DataFrame to the table named "driver_versions" # in the Snowflake database. sf_connector_version_df.to_sql('driver_versions', engine, index=False, method=pd_writer) # When the column names consist of only lower case letters, quote the column names sf_connector_version_df = pd.DataFrame([('snowflake-connector-python', '1.0')], columns=['"name"', '"newest_version"']) sf_connector_version_df.to_sql('driver_versions', engine, index=False, method=pd_writer)
pd_writer関数は、write_pandas()関数を使用して、 DataFrame のデータをSnowflakeデータベースに書き込みます。- パラメーター:
有効な入力パラメーターは次のとおりです。
パラメーター
必須
説明
table有り
テーブルの
pandas.io.sql.SQLTableオブジェクト。conn有り
Snowflakeデータベースへの接続に使用される、
sqlalchemy.engine.Engineまたはsqlalchemy.engine.Connectionオブジェクト。keys有り
挿入するデータのテーブル列の名前。
data_iter有り
挿入するデータを含む行の反復子。
- 例:
次の例では、
method=pd_writerをpandas.DataFrame.to_sqlメソッドに渡し、次にpd_writer関数を呼び出してPandas DataFrame のデータをSnowflakeデータベースに書き込みます。import pandas from snowflake.connector.pandas_tools import pd_writer # Create a DataFrame containing data about customers df = pandas.DataFrame([('Mark', 10), ('Luke', 20)], columns=['name', 'balance']) # Specify that the to_sql method should use the pd_writer function # to write the data from the DataFrame to the table named "customers" # in the Snowflake database. df.to_sql('customers', engine, index=False, method=pd_writer)
日付およびタイムスタンプのサポート¶
Snowflakeは複数の DATE および TIMESTAMP データ型をサポートし、Snowflakeコネクタでは、更新およびフェッチ操作のためにネイティブの datetime および date オブジェクトをバインドできます。
データのフェッチ¶
日付と時刻のデータをフェッチすると、Snowflakeのデータ型はPythonのデータ型に変換されます。
Snowflakeデータ型 |
Pythonのデータ型 |
動作 |
|---|---|---|
TIMESTAMP_TZ |
タイムゾーンオフセットを含むデータをフェッチし、 |
|
TIMESTAMP_LTZ, TIMESTAMP |
データをフェッチし、 |
|
TIMESTAMP_NTZ |
データをフェッチし、 |
|
DATE |
データをフェッチし、 |
注釈
tzinfo IANA タイムゾーン名ではなく、 UTC オフセットベースのタイムゾーンオブジェクトです。タイムゾーン名は一致しない場合がありますが、同等のオフセットベースのタイムゾーンオブジェクトは同一と見なされます。
データの更新¶
日付と時刻のデータを更新すると、Pythonデータ型はSnowflakeデータ型に変換されます。
Pythonのデータ型 |
Snowflakeデータ型 |
動作 |
|---|---|---|
datetime |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
日付時刻オブジェクトを |
struct_time |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
struct_timeオブジェクトを |
date |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
日付オブジェクトを |
time |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
時間オブジェクトを |
timedelta |
TIMESTAMP_TZ, TIMESTAMP_LTZ, TIMESTAMP_NTZ, DATE |
タイムデルタオブジェクトを |