Python Connector API¶
Snowflake Connector for Python 采用 Python 数据库 API v2.0 规范 (PEP-249)。本主题介绍标准 API 和 Snowflake 特定的扩展。
本主题内容:
模块:snowflake.connector¶
主模块是 snowflake.connector,它创建一个 Connection 对象并提供 Error 类。
常量¶
- apilevel¶
字符串常量,表示支持 API 级别。连接器支持 API
"2.0"。
- threadsafety¶
整数常量,表示界面支持的线程安全级别。Snowflake Connector for Python 支持
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.cn后缀。. . 有关详细信息和示例,请参阅 :ref:` 使用说明 <label-account_format_info>`(本主题内容)。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。passcodeDuo 在使用 MFA(多重身份验证)登录时提供的密码。
private_key用于身份验证的私钥。有关更多信息,请参阅 使用密钥对身份验证和密钥对轮换。
private_key_file指定指定用户的私钥文件的路径。请参阅 使用密钥对身份验证和密钥对轮换。
private_key_file_pwd指定用于解密指定用户的私钥文件的密码。请参阅 使用密钥对身份验证和密钥对轮换。
autocommit默认为
None,它遵循 Snowflake 参数 AUTOCOMMIT。分别设置为True或False,以启用或禁用会话中的自动提交模式。client_fetch_use_mp当设置为
True时,它将启用多处理提取,这在许多情况下应该会减少提取时间。默认值: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`(通过显式指定值或省略该实参)时,:ref:`label-client_session_keep_alive会话参数优先。. .
将
client_session_keep_alive=False传递给connect方法 不会 替换CLIENT_SESSION_KEEP_ALIVE会话参数中的值TRUE。login_timeout登录超时(以秒为单位)。默认情况下,为 60 秒。如果 HTTP 响应是“成功”,则登录请求在超时时限后放弃。
network_timeout所有其他操作的超时(以秒为单位)。默认情况下,为无/无限。如果 HTTP 响应不是“成功”,则一般请求在超时时限后放弃。
ocsp_response_cache_filenameOCSP 响应缓存文件的 URI。默认情况下,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 的身份验证器:
:code:`snowflake`(默认),使用内部 Snowflake 身份验证器。
externalbrowser,使用您的 Web 浏览器和 Okta、AD FS 或已为您的账户定义的任何其他符合 SAML 2.0 的身份提供商 (IdP) 进行身份验证。https://<okta_account_name>.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_IDENTITYto authenticate with the workload identity federation (WIF) authenticator.
如果该值不是
snowflake,则用户和密码参数必须是 IdP 的登录凭据。validate_default_parameters默认为
False。如果为True,则:如果指定的数据库、架构或仓库不存在,则引发异常。
如果传递了无效的实参名称或错误数据类型的实参值,则向标准错误 (stderr) 打印警告。
paramstyle对于客户端绑定,默认为
pyformat。指定qmark或numeric来更改服务器端绑定的绑定变量格式。timezone默认为
None,它遵循 Snowflake 参数 TIMEZONE。设置为有效时区(例如America/Los_Angeles),从而设置会话时区。arrow_number_to_decimal默认为
False,这意味着以双精度浮点数 (float64) 的形式返回 NUMBER 列值。. . 将其设置为True,在调用fetch_pandas_all()和fetch_pandas_batches()方法时以十进制数 (decimal.Decimal) 的形式返回 DECIMAL 列值。. . 在 Snowflake Connector for Python 版本 2.4.3 中引入此参数。socket_timeout套接字级读取和连接请求的超时(以秒为单位)。有关更多信息,请参阅 管理连接超时。
backoff_policy生成器函数的名称,用于定义重试之间的等待时间。有关更多信息,请参阅 管理重试的连接退避策略。
enable_connection_diag是否生成连接诊断报告。默认值为
False。connection_diag_log_path诊断报告位置的绝对路径。仅在
enable_connection_diag为True的情况下使用。默认为操作系统的默认临时目录,例如/tmp,适用于 Linux 或 Mac。connection_diag_allowlist_path包含
SYSTEM$ALLOWLIST()或SYSTEM$ALLOWLIST_PRIVATELINK()输出的 JSON 文件的绝对路径。只有在连接中定义的用户没有权限运行系统允许列表功能或连接账户 URL 失败时才需要。iobound_tpe_limitpreprocess_tpe 和 postprocess 线程池执行器 (TPEs) 的大小。默认情况下,该值为文件数和 CPU 核心数中的较小值。
unsafe_file_write使用 GET 命令,指定要为从暂存区下载的文件分配的文件权限。
False`(默认)将文件权限设置为 :codenowrap:`600,这意味着只有所有者可以访问文件。True将权限设置为644,这会授予所有者读写权限,并向其他所有人授予只读权限。有关更多信息,请参阅 下载数据。oauth_client_id身份提供商为 Snowflake 集成提供的
client id的值(Snowflake 安全集成元数据)。oauth_client_secret身份提供商为 Snowflake 集成提供的
client secret的值(Snowflake 安全集成元数据)。oauth_authorization_url向驱动程序提供授权码的身份提供商端点。当使用 Snowflake 作为身份提供商时,此值源自
server或account参数。oauth_token_request_url向驱动程序提供访问令牌的身份提供商端点。当使用 Snowflake 作为身份提供商时,此值源自
server或account参数。oauth_scope身份提供商授权请求中请求的范围。默认情况下,它源自角色。当需要多个作用域时,该值应为以空格分隔的多个作用域列表。
oauth_redirect_uriURI to use for authorization code redirection (Snowflake security integration metadata). Default:
http://127.0.0.1:{randomAvailablePort}.oauth_disable_pkce禁用代码交换证明密钥 (PKCE),这是一项安全增强功能,可确保即使恶意攻击者拦截了授权码,也无法将其更改为有效的访问令牌。
oauth_enable_refresh_token在实际访问令牌过期时启用静默重新身份验证,前提是授权服务器支持该功能并且
client_store_temporary_credential设置为True。oauth_enable_single_use_refresh_tokens是否选择启用一次性刷新令牌语义。
workload_identity_providerPlatform of the workload identity provider. Possible values include:
AWS,AZURE,GCP, andOIDC.
属性¶
- Error, Warning, ...
Python 数据库 API 标准定义的所有异常类。Snowflake Connector for Python 提供属性
msg、errno、sqlstate、sfqid和raw_msg。
account 参数的用法说明(适用于 connect 方法)¶
对于 必填 account 的参数,请指定您的 :doc:` 账户标识符 </user-guide/gen-conn-config>`。
请注意,账户标识符 不 包括 snowflakecomputing.cn 域名。Snowflake 会在创建连接时自动追加此内容。
以下示例示例使用 账户名称作为标识符,该账户 myaccount 位于组织 myorganization 中。
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()¶
- 目的:
关闭连接。如果在连接关闭时事务仍处于打开状态,则 :emph:` 回滚 ` 更改。
关闭连接会从服务器显式移除活动会话;否则,活动会话将继续进行,直到最终从服务器中清除,从而限制并发查询的数量。
例如:
# 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)¶
- 目的:
执行作为字符串传递的一个或多个 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])
备注
允许在单个字符串中使用多个 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)¶
- 目的:
执行作为流对象传递的一个或多个 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`(就像 :py:meth:`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属性中可用的相同元数据。在 Snowflake Connector for Python 的 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中找到的所有参数序列执行该命令。您可以使用此方法 执行批量插入操作。- 参数:
commandseq_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 语句并向其传递多个绑定值。不支持在一次
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。
如果没有行,这会返回
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,它包含结果集中行的子集。
如果没有更多行可提取,则返回
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__()¶
返回 Self 以使游标与迭代协议兼容。
属性¶
- 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_nullable如果列或
False允许 NULL 值,则为True。有关获取此属性的示例,请参阅 检索列元数据。
- rowcount¶
只读属性,返回上次
execute生成的行数。如果未执行execute,则该值为-1或None。
- sfqid¶
只读属性,返回上次
execute或execute_async执行中的 Snowflake 查询 ID。
- arraysize¶
读/写属性,指定使用
fetchmany()一次提取的行数。默认为1,它意味着一次提取一行。
- connection¶
只读属性,返回对在其上创建游标的
Connection对象的引用。
- messages
列表对象,包含从游标的基础数据库接收的所有消息的序列(异常类、异常值)。
除
fetch*()调用外,任何方法调用都会自动清除该列表。
- errorhandler
读/写属性,该属性在满足错误条件时引用要调用的错误处理程序。
此处理程序必须是接受以下实参的 Python 可调用处理程序:
errorhandler(connection, cursor, errorclass, errorvalue)
类型代码¶
在 Cursor 对象中,description 属性和 describe() 方法提供描述结果集中列的元组(或 2.4.6 版本及更高版本中的 ResultMetadata 对象)列表。
在元组中,索引 1 的值(ResultMetadata 对象中的 type_code 属性)表示列数据类型。Snowflake Connector for Python 使用以下映射根据类型代码获取字符串的表示形式:
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, <scale>) |
|
REAL |
|
TEXT |
|
TEXT |
|
BINARY |
|
BINARY |
|
BOOLEAN |
|
DATE |
|
TIME |
|
TIME |
|
TIMESTAMP_NTZ |
|
TIMESTAMP_NTZ |
如果需要映射到另一个 Snowflake 类型(例如从 datetime 到 TIMESTAMP_LTZ),请在元组中指定 Snowflake 数据类型,该元组由值前面的 Snowflake 数据类型组成。有关示例,请参阅 :ref:` 绑定日期时间 TIMESTAMP <label-python_connector_binding_timestmamp_qmark>`。
对象:Exception¶
PEP-249 定义了在出现错误或警告时,Snowflake Connector for Python 可能引发的异常。应用程序必须正确处理它们,并决定继续或停止运行代码。
方法¶
没有可用于 Exception 对象的方法。
属性¶
- errno¶
Snowflake DB 错误代码。
- msg¶
错误消息包括错误代码、SQL 状态代码和查询 ID。
- raw_msg¶
错误消息。不包含错误代码、SQL 状态代码或查询 ID。
- sqlstate¶
符合 ANSI 的 SQL 状态代码
- sfqid
Snowflake 查询 ID。
对象 ResultBatch¶
对象 ResultBatch 封装一个函数,该函数检索结果集中的行子集。要 在多个工作线程或节点之间分配提取结果的工作,可以在 游标 对象中调用 get_result_batches() 方法来检索 ResultBatch 对象列表,并将这些对象分发给不同的工作线程或节点进行处理。
属性¶
行数¶
只读属性,返回结果批处理中的行数。
compressed_size¶
只读属性,返回结果批处理中的数据大小(已压缩)。
uncompressed_size¶
只读属性,返回结果批处理中的数据大小(未压缩)。
方法¶
- to_arrow()¶
- 目的:
此方法返回一个 PyArrow 表,它包含
ResultBatch对象中的行。- 参数:
无。
- 返回:
返回一个 PyArrow 表,它包含来自
ResultBatch对象中的行。如果没有行,则返回 None。
- to_pandas()¶
- 目的:
此方法返回一个 pandas DataFrame,它包含
ResultBatch对象中的行。- 参数:
无。
- 返回:
返回一个 pandas DataFrame,它包含
ResultBatch对象中的行。如果没有行,则返回一个空的 pandas DataFrame。
对象:ResultMetadata¶
一个 ResultMetadata 对象,表示有关结果集中列的元数据。Cursor 对象的 description 属性和 describe 方法返回这些对象的列表。
此对象是在 Snowflake Connector for Python 的 2.4.6 版本中引入的。
方法¶
无。
属性¶
- name¶
列的名称
- display_size¶
未使用。与 internal_size 相同。
- internal_size¶
内部数据大小。
- precision¶
数值数据的精度。
- scale¶
数值数据的小数位数。
- is_nullable¶
如果列或
False允许 NULL 值,则为True。
模块: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 数据分析库的函数。
函数¶
- write_pandas(parameters...)¶
- 目的:
将 pandas DataFrame 写入 Snowflake 数据库中的表。
若要将数据写入表,该函数将数据保存到 Parquet 文件,使用 PUT 命令将这些文件上传到临时暂存区,然后使用命令 COPY INTO <table> 将数据从文件复制到表中。您可以使用一些函数参数来控制
PUT和COPY INTO <table>语句的执行方式。- 参数:
有效的输入参数为:
参数
必填
描述
conn是
Connection对象,用于保持与 Snowflake 数据库的连接。df是
pandas.DataFrame对象,包含要复制到表中的数据。table_name是
应将数据复制到其中的表的名称。
database包含表的数据库名称。默认情况下,该函数将写入在会话中正在使用的数据库。注意:如果指定此参数,则还必须指定该
schema参数。schema包含表的架构名称。默认情况下,该函数写入架构中的表,该架构正在会话中使用。
bulk_upload_chunks如果将此参数设置为
True,则会更改write_pandas函数的行为,即先将所有数据块写入到本地磁盘,然后将数据块文件夹以通配符的形式上传至暂存区。当设置为 :codenowrap:`False`(默认)时,数据块将逐一保存、上传和删除。chunk_size一次要插入的元素数量。默认情况下,该函数将所有元素一次插入到一个块中。
compression用于 Parquet 文件的压缩算法。您可以指定
"gzip"以压缩得更好,或指定"snappy"以压缩得更快。默认情况下,该函数使用"gzip"。on_error指定应如何处理错误。将其设置为
ON_ERROR:ref:` 复制选项 <label-copy_into_table_copyoptions>` 中记录的字符串值之一。默认情况下,该函数使用"ABORT_STATEMENT"。parallel将 Parquet 文件上传到临时暂存区时要使用的线程数。有关使用的默认线程数和选择线程数的准则,请参阅 :ref:` PUT 命令的 parallel 参数<label-put_parameter_parallel>`。
quote_identifiers若为
False,则阻止连接器在将标识符发送到服务器之前 在标识符周围加上双引号。默认情况下,连接器在标识符两边加上双引号。- 返回:
返回
(success, num_chunks, num_rows, output)的元组,其中:如果函数成功将数据写入表,则
success为True。num_chunks是函数复制的数据块数。num_rows是函数插入的行数。output是COPY INTO <table>命令的输出。
- 示例:
以下示例将 pandas DataFrame 中的数据写入名为“customers”的表。
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是
sqlalchemy.engine.Engine或sqlalchemy.engine.Connection对象,用于连接 Snowflake 数据库。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 是一个 UTC 基于偏移时区的对象,而不是 IANA 时区名称。时区名称可能不匹配,但基于偏移的等效时区对象被视为相同。
更新数据¶
更新日期和时间数据时,Python 数据类型将转换为 Snowflake 数据类型:
Python 数据类型 |
Snowflake 数据类型 |
行为 |
|---|---|---|
datetime |
TIMESTAMP_TZ、TIMESTAMP_LTZ、TIMESTAMP_NTZ、DATE |
将 Datetime 对象转换为 |
struct_time |
TIMESTAMP_TZ、TIMESTAMP_LTZ、TIMESTAMP_NTZ、DATE |
将 struct_time 对象转换为 |
日期 |
TIMESTAMP_TZ、TIMESTAMP_LTZ、TIMESTAMP_NTZ、DATE |
将日期对象转换为格式为 |
time |
TIMESTAMP_TZ、TIMESTAMP_LTZ、TIMESTAMP_NTZ、DATE |
将时间对象转换为格式为 |
timedelta |
TIMESTAMP_TZ、TIMESTAMP_LTZ、TIMESTAMP_NTZ、DATE |
将 timedelta 对象转换为格式为 |