了解 dbt 项目对象¶
DBT PROJECT 是一个架构级别的对象,它包含 Snowflake 中 dbt 项目的版本控制源文件。您可以将 dbt 项目对象连接到工作区,也可以独立于工作区创建和管理对象。
dbt 项目对象通常基于包含 dbt-project.yml 文件的 dbt 项目目录。这是当您从工作区中 :doc:`部署 </user-guide/data-engineering/dbt-projects-on-snowflake-deploy>`(创建)dbt 项目对象时 Snowflake 使用的模式。
dbt 项目对象支持基于角色的访问控制 (RBAC)。您可以像处理 Snowflake 中的其他架构级对象一样,对 dbt 项目对象执行 CREATE、ALTER 和 DROP 操作。您可以从 Snowflake 仓库中使用 EXECUTE DBT PROJECT 命令来运行 dbt 命令(如 test 和 run)。您也可以使用 任务 来计划这些命令的执行。
dbt 项目对象如何更新¶
编辑工作区时,dbt 项目对象不会自动更新;每次希望对象获取代码更改时,都必须进行部署(即添加新版本)。
要创建生产管道,建议创建 dbt 项目对象,并 通过任务调度其执行。由于每个 dbt 项目对象版本都是不可变的,因此这样做可以确保运行之间不会发生任何变化,除非有人显式添加新版本。
要更新 dbt 项目的文件,必须在工作区中添加新版本,例如:
ALTER DBT PROJECT testdbt.public.my_dbt_project_object
ADD VERSION FROM 'snow://workspace/user$.public."all_my_dbt_projects"/versions/last';
如果您的 dbt 项目由 Git 提供支持,并且您想自动执行测试和部署,请运行带 --force 选项的 Snow CLI snow dbt deploy 命令,如以下示例所示:
snow dbt deploy --source 'snow://workspace/user$.public."all_my_dbt_projects"/versions/last' --force my_dbt_project;
--force 使您能够添加版本;如果没有它,则相当于在已创建的对象上运行 CREATE DBT PROJECT,这将会失败。
有关版本控制的更多信息,请参阅 dbt 项目对象和文件的版本控制。
dbt 项目对象和文件的版本控制¶
Snowflake 维护 dbt 项目对象的版本及其相应的项目文件。您可以在整个数据开发和部署生命周期中使用此版本控制来跟踪和管理更改。Snowflake 通过以下示例所示的方式识别 dbt 项目暂存区中的 dbt 项目对象版本。
snow://dbt/my_db.my_schema.my_dbt_project_object/versions/version_id
version_id 可以是以下任一标识符:
VERSION$<num>– 以VERSION$<num>的形式指定版本标识符,其中<num>is a positive integer, for example,VERSION$1。当您创建 dbt 项目对象时,版本号从
1开始,并随着 dbt 项目对象的每个新版本递增一。当您执行以下任务时,Snowflake 会递增版本标识符:
从工作区中 :ui:`Redeploy dbt project`(运行带 ADD VERSION 选项的 ALTER 命令)。
通过使用 ALTER DBT PROJECT 命令更新项目。
运行带
--force选项的 Snow CLIsnow dbt deploy命令。当您运行以下命令时,Snowflake 会将版本标识符重置为
1并移除所有版本别名:
在 SQL 中,带
OR REPLACE选项 CREATE DBT PROJECT 命令。
LAST– 表示 dbt 项目对象的最新版本。
FIRST– 表示 dbt 项目对象的最早版本。
version_name_alias– 表示您已使用带 ADD VERSION 选项的 ALTER DBT PROJECT 命令为特定版本的 dbt 项目对象创建的自定义版本名称别名。版本名称别名始终映射到特定的版本标识符,例如VERSION$3。
存储在 dbt 项目暂存区中的项目文件按版本进行组织,每个版本都有自己的子目录。例如,名为 my_dbt_project_object、版本标识符为 VERSION$3 且 dbt 项目文件名为 dbt_project.yml 的 dbt 项目对象,可以按下例所示方式进行引用:
snow://dbt/my_db.my_schema/my_dbt_project_object/versions/VERSION$3/dbt_project.yml