使用版本化架构跨版本管理应用程序对象¶
本主题介绍在安装和升级 Snowflake Native App 时,如何使用版本化架构管理应用程序状态。
关于版本化架构¶
版本化架构是一种特殊类型的数据库架构,旨在处理从一个版本到另一个版本的无状态对象。
版本化架构包含应用程序中与特定版本相关联的对象的元数据。版本固定是版本化架构的一项功能,可让应用程序知道哪些作业、查询等与这些对象相关联。
例如,当版本化架构中的对象运行查询时,该查询会被“固定”在运行查询的应用程序版本上。
在将应用程序升级到新版本时,版本固定非常重要。假设应用程序 V1 运行一个复杂的查询,需要很长时间才能完成。
如果该查询仍在运行时发生升级,则应用程序的升级状态将变为 COMPLETE
,应用程序升级到 v2
。在 v1
版本的所有任务都完成之前,先前的版本状态会更改为 FINALIZING
。
有关应用程序升级状态的更多信息,请参阅 升级状态。
对版本化架构的限制¶
版本化架构不支持 Snowpark Container Services。
版本化架构只能在应用程序对象的上下文中使用。它们只在安装脚本中创建。每个版本的应用程序都有自己的安装脚本,并包含该版本专用的版本化架构。
版本化架构只能在应用程序包的安装脚本中使用。只能在应用程序对象的上下文中创建它们。
版本化架构不支持任务。例如,在创建或更改版本化架构时,提供商不能包含标签。不过,提供商可以在版本化架构中使用标签,前提是他们只在同一应用程序的版本化架构中应用这些标签对象。
版本化架构不支持标签和掩码策略。
版本化架构不支持授权和未来授权。
版本化架构不能用作克隆操作的源或目标。
不支持删除版本化架构。删除版本化架构会删除其中包含的对象的所有版本,并会影响针对应用程序旧版本或补丁运行的查询。
备注
要在应用程序的安装脚本中使用应用程序角色、任务、标签、掩码策略和 Snowpark Container Services,必须在正常架构中创建它们。
版本化架构的内部实现¶
在内部,版本化架构包含与每个应用程序版本相对应的子架构。
不过,用户无法直接访问应用程序对象中的这些子架构。使用者只能在版本化架构中看到与其账户中安装的应用程序版本相对应的对象。
例如,如果使用者使用 SHOW OBJECTS 命令查看版本化架构中的对象,则只能看到当前使用版本的对象。
编写安装脚本时,提供商必须使用 CREATE OR REPLACE 或 CREATE IF NOT EXISTS 在版本化架构中重新创建对象。这一点很重要,因为在内部,每个版本的应用程序在版本化架构的子架构中都有自己的对象。
在安装脚本中使用版本化架构和非版本化架构¶
为了在升级过程中管理应用程序的状态,Snowflake Native App Framework 会使用版本化架构。版本化架构与普通数据库架构类似,但增加了处理由不同应用程序版本创建的对象多个版本的功能。
版本化架构只能在应用程序对象的上下文中使用。它们只在安装脚本中创建。每个版本的应用程序都有自己的安装脚本,并包含该版本专用的版本化架构。
在开发新版本的应用程序时,提供商必须考虑到应用程序使用安装脚本创建的对象的更改。
下面的示例展示了一种常见情况,即在安装脚本中可同时使用版本化架构和普通架构来创建无状态和有状态组件:
CREATE OR ALTER VERSIONED SCHEMA stateless_objects;
CREATE OR REPLACE PROCEDURE stateless_object.py_echo_proc(STR string)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION=3.8
PACKAGES=('snowflake-snowpark-python')
HANDLER='echo.echo_proc'
IMPORTS=('/libraries/echo.py');
CREATE OR ALTER SCHEMA stateful_object;
CREATE TABLE stateful_object.config_props
prop_name STRING;
prop_value STRING;
time_stamp TIMESTAMP;
创建版本化架构¶
要使用安装脚本创建版本化架构,请使用 CREATE OR ALTER VERSIONED SCHEMA 命令,如以下示例所示:
CREATE OR ALTER VERSIONED SCHEMA version_schema;
备注
应始终包含该命令的 CREATE OR ALTER 版本,以确保版本化架构在不同版本和补丁间兼容。
将非版本化架构用于有状态对象¶
应用程序中的对象可能需要跨版本保留状态。例如,配置数据或应用程序运行时收集的数据可能需要保留。
这些类型的对象必须驻留在正常的数据库架构中,它们应在初始安装和升级时创建为持久对象。
下面的示例展示了如何在安装脚本中创建有状态对象:
CREATE SCHEMA IF NOT EXISTS stateful_object;
CREATE TABLE IF NOT EXISTS stateful_object.config (
config_param STRING,
config_value STRING,
default_value STRING,
modified_on TIMESTAMP);
ALTER TABLE stateful_object.config
ADD COLUMN IF NOT EXISTS modified_on TIMESTAMP;
在此示例中,安装脚本定义了一个配置表,其将从一个应用程序版本持续到另一个版本。如果以前版本的应用程序没有 modified_on
列,安装脚本会首先尝试完全创建该表格(首次安装时)或通过添加该列修改现有表格(升级时)。
将版本化架构用于无状态对象¶
应用程序中的某些对象不会在不同版本的应用程序之间持续保持状态。例如,定义应用程序逻辑的代码(包括存储过程、函数等)可以在安装脚本中完全重新创建,而不会丢失任何用户数据或状态。
Snowflake 建议将这些对象包含在版本化架构中。
下面的示例展示了如何在版本化架构中创建 UDF。
CREATE OR ALTER VERSIONED SCHEMA stateless_object;
CREATE FUNCTION IF NOT EXISTS stateless_object.add(x int, y int)
RETURNS INT
LANGUAGE SQL
AS $$ x + y $$;
版本固定¶
版本化架构包含有关 Snowflake Native App 中哪些对象与特定版本相关联的元数据。版本固定是版本化架构的一项功能,可让应用程序知道哪些作业、查询等与这些对象相关联。
例如,当版本化架构中的对象运行查询时,该查询会被“固定”在运行查询的应用程序版本上。
在将应用程序升级到新版本时,版本固定非常重要。假设应用程序 V1 运行一个复杂的查询,需要很长时间才能完成。如果该查询仍在运行时发生升级,则在查询完成之前,应用程序将不会升级。