为存储过程编写 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;
    
    Copy

编写方法或函数

为存储过程编写方法或函数时,请注意以下事项:

  • 指定 Snowpark Session 对象作为方法或函数的第一个实参。调用存储过程时,Snowflake 会自动创建一个 Session 对象并将其传递给存储过程。(您不能自行创建 Session 对象。)

  • 对于其余实参和返回值,请使用与 Snowflake 数据类型 中列出的 Python 数据类型。

  • 在过程的处理程序中运行异步子作业(例如使用 DataFrame.collect_nowait)时,不支持“发后即忘”。

    换句话说,如果处理程序发出的子查询在父存储过程作业完成时仍在运行,子作业就会自动取消。

处理错误

您可以使用正常的 Python 异常处理技术来捕获过程中的错误。

如果方法内部出现未捕获的异常,Snowflake 会引发一个包含异常堆栈跟踪的错误。启用 记录未处理异常 后,Snowflake 会在事件表中记录有关未处理异常的数据。

为代码提供依赖项

如果处理程序代码依赖在处理程序之外(如模块中定义的代码)定义的代码或依赖资源文件,则可以通过将这些依赖项上传到暂存区来为代码提供这些依赖项。请参阅 为代码提供依赖项,或者对于 Python 工作表,请参阅 将 Python 文件从暂存区添加到工作表

如果使用 SQL 创建存储过程,请在编写 CREATE PROCEDURE 语句 时使用 IMPORTS 子句,以指向依赖项文件。

语言: 中文