为存储过程编写 Python 处理程序¶
您可以编写 Python 代码,作为在调用存储过程时执行的处理程序。本节介绍处理程序的设计。
您可以通过多种方式通过处理程序代码创建存储过程:
将代码内联到用于创建过程的 SQL 语句中。请参阅 将处理程序代码保持内联或保留在暂存区。
将代码复制到某个暂存区,并在创建过程时在此处进行引用。请参阅 将处理程序代码保持内联或保留在暂存区。
在 Python 工作表中编写代码,并将工作表内容部署到存储过程。请参阅 从 Python 工作表创建存储过程。
计划编写存储过程¶
存储过程在 Snowflake 内部运行,因此您在规划代码时必须考虑到这一点。
限制消耗的内存量。Snowflake 根据所需的内存量对方法进行了限制。如需指导,请参阅 设计保持在 Snowflake 施加的约束范围内的处理程序。
确保您的处理程序方法或函数是线程安全的。
遵守规则和安全限制。请参阅 UDFs 和过程的安全实践。
确定是否希望以 :doc:` 调用者权限或所有者权限 </developer-guide/stored-procedure/stored-procedures-rights>` 运行存储过程。
考虑用于运行存储过程的 snowflake-snowpark-python 版本。由于存储过程发布流程的限制,Python 存储过程环境中可用的 snowflake-snowpark-python 库通常比公开发布的版本落后一个版本。使用以下 SQL 查找最新可用版本:
SELECT * FROM information_schema.packages WHERE package_name = 'snowflake-snowpark-python' ORDER BY version DESC;
编写方法或函数¶
为存储过程编写方法或函数时,请注意以下事项:
指定 Snowpark
Session
对象作为方法或函数的第一个实参。调用存储过程时,Snowflake 会自动创建一个Session
对象并将其传递给存储过程。(您不能自行创建Session
对象。)对于其余实参和返回值,请使用与 Snowflake 数据类型 中列出的 Python 数据类型。
在过程的处理程序中运行异步子作业(例如使用 DataFrame.collect_nowait)时,不支持“发后即忘”。
换句话说,如果处理程序发出的子查询在父存储过程作业完成时仍在运行,子作业就会自动取消。
处理错误¶
您可以使用正常的 Python 异常处理技术来捕获过程中的错误。
如果方法内部出现未捕获的异常,Snowflake 会引发一个包含异常堆栈跟踪的错误。启用 记录未处理异常 后,Snowflake 会在事件表中记录有关未处理异常的数据。
为代码提供依赖项¶
如果处理程序代码依赖在处理程序之外(如模块中定义的代码)定义的代码或依赖资源文件,则可以通过将这些依赖项上传到暂存区来为代码提供这些依赖项。请参阅 为代码提供依赖项,或者对于 Python 工作表,请参阅 将 Python 文件从暂存区添加到工作表。
如果使用 SQL 创建存储过程,请在编写 CREATE PROCEDURE 语句 时使用 IMPORTS 子句,以指向依赖项文件。