当前位置: 首页 > wzjs >正文

做淘客都有什么网站做网站要下载的软件

做淘客都有什么网站,做网站要下载的软件,页面设计比较好的公司,莱芜杂谈莱芜话题在数据工程和数据分析领域,SQL是不可或缺的工具。随着项目复杂度的增加,如何高效地管理和复用SQL代码成为了一个重要课题。SQLMesh作为一款强大的工具,不仅支持标准的SQL语法,还引入了Jinja模板引擎的宏功能,极大地提升…

在数据工程和数据分析领域,SQL是不可或缺的工具。随着项目复杂度的增加,如何高效地管理和复用SQL代码成为了一个重要课题。SQLMesh作为一款强大的工具,不仅支持标准的SQL语法,还引入了Jinja模板引擎的宏功能,极大地提升了SQL查询的灵活性和复用性。本文将深入探讨SQLMesh中Jinja宏的使用方法及其优势。

在这里插入图片描述

什么是Jinja宏?

Jinja是一个流行的Python模板引擎,广泛用于Web开发中生成动态HTML内容。然而,Jinja的宏功能并不仅限于Web开发,它同样适用于SQL查询的构建。Jinja的宏通过字符串替换的方式工作,与SQLMesh的宏不同,它不构建语义表示,而是直接组装SQL查询文本。
在这里插入图片描述

Jinja的基本语法

Jinja使用大括号 {} 来区分宏和非宏文本。具体来说:

  • {{...}} 创建Jinja表达式,用于插入变量或函数的结果。
  • {%...%} 创建Jinja语句,用于控制流程、设置变量等。
  • {#...#} 创建Jinja注释,不会出现在渲染后的SQL查询中。

在SQLMesh中使用Jinja宏

为了确保SQLMesh能够正确解析包含Jinja宏的SQL查询,必须将模型查询包裹在特殊的 JINJA_QUERY_BEGIN; ...; JINJA_END; 块中。例如:

MODEL (name sqlmesh_example.full_model);
JINJA_QUERY_BEGIN;
SELECT {{ 1 + 1 }};
JINJA_END;

如果需要在模型查询之前或之后执行某些操作,可以使用 JINJA_STATEMENT_BEGIN; ...; JINJA_END; 块:

MODEL (name sqlmesh_example.full_model);
JINJA_STATEMENT_BEGIN;
{{ pre_hook() }}
JINJA_END;
JINJA_QUERY_BEGIN;
SELECT {{ 1 + 1 }};
JINJA_END;
JINJA_STATEMENT_BEGIN;
{{ post_hook() }}
JINJA_END;

SQLMesh预定义变量

SQLMesh提供了一些预定义变量,帮助用户更好地管理和构建SQL查询:

  • 项目相关变量:如 runtime_stagethis_model,提供关于SQLMesh项目本身的信息。
  • 时间相关变量:如 start_dsexecution_date,用于构建增量模型查询,仅在增量模型类型中可用。

使用这些变量时,需用大括号 {} 包裹变量名,并根据返回值类型决定是否加单引号。例如:

JINJA_QUERY_BEGIN;
SELECT * FROM table WHERE time_column BETWEEN '{{ start_ds }}' AND '{{ end_ds }}';
JINJA_END;

用户自定义变量

SQLMesh支持两种用户自定义宏变量:全局变量和局部变量。

全局变量

全局变量在项目配置文件中定义,可以在任何项目模型中访问。使用 var 函数获取全局变量的值,并可指定默认值以防止变量未定义的情况。例如:

JINJA_QUERY_BEGIN;
SELECT * FROM table WHERE int_variable = {{ var('int_var') }};
JINJA_END;

如果变量可能未定义,可以提供默认值:

JINJA_QUERY_BEGIN;
SELECT * FROM table WHERE some_value = {{ var('missing_var', 0) }};
JINJA_END;

局部变量

局部变量在模型定义中使用Jinja的 {% set %} 语句定义,仅在该模型中有效。例如:

MODEL (name sqlmesh_example.full_model, kind FULL, cron '@daily', audits(assert_positive_order_ids));
JINJA_QUERY_BEGIN;
{% set my_col = 'num_orders' %}
SELECT item_id, count(distinct id) AS {{ my_col }}
FROM sqlmesh_example.incremental_model
GROUP BY item_id
JINJA_END;

Jinja控制流与循环

Jinja提供了强大的控制流和循环功能,可以简化重复代码的编写。

For循环

通过 {% for %} 语句,可以轻松迭代集合中的项目。例如,创建多个条件变量:

SELECT
{% for vehicle_type in ['car', 'truck', 'bus'] %}CASE WHEN user_vehicle = '{{ vehicle_type }}' THEN 1 ELSE 0 END AS vehicle_{{ vehicle_type }},
{% endfor %}
FROM table

为了提高代码的可维护性,建议将列表定义在循环外部:

{% set vehicle_types = ['car', 'truck', 'bus'] %}
SELECT
{% for vehicle_type in vehicle_types %}CASE WHEN user_vehicle = '{{ vehicle_type }}' THEN 1 ELSE 0 END AS vehicle_{{ vehicle_type }},
{% endfor %}
FROM table

If语句

{% if %} 语句允许根据条件执行不同的操作。例如,仅在测试模式下包含特定列:

{% set testing = True %}
SELECT normal_column,
{% if testing %}testing_column
{% endif %}
FROM table

在上述例子中,如果 testingTrue,则渲染后的查询将包含 testing_column

用户自定义宏函数

Jinja宏函数允许在多个模型中复用相同的宏代码。宏函数应定义在SQLMesh项目 macros 目录下的 .sql 文件中。

定义宏函数

使用 {% macro %}{% endmacro %} 语句定义宏函数。例如,定义一个简单的打印文本的宏:

{% macro print_text() %}
text
{% endmacro %}

在SQL模型中调用该宏:

{{ print_text() }}

渲染后的查询将包含 "text"

带参数的宏函数

宏函数可以接受参数,增强其灵活性。例如,生成带有别名的SQL列:

{% macro alias(expression, alias) %}{{ expression }} AS {{ alias }}
{% endmacro %}

在SQL查询中使用:

SELECT item_id, {{ alias('item_id', 'item_id2') }} FROM table

渲染后的查询为:

SELECT item_id, item_id AS item_id2 FROM table

需要注意的是,Jinja在渲染过程中会根据上下文识别参数类型。如果需要将表达式作为字符串处理,可以使用双引号:

SELECT item_id, {{ alias("'item_id'", 'item_id2') }} FROM table

渲染结果为:

SELECT item_id, 'item_id' AS item_id2 FROM table

最后总结

SQLMesh支持同时使用Jinja和SQLMesh的宏系统。然而,强烈建议在一个模型中仅使用一种宏系统,以避免潜在的冲突和不可预见的行为。预定义的SQLMesh宏变量可以在包含用户自定义Jinja变量和函数的查询中使用,但传递给Jinja宏函数的预定义变量必须使用Jinja的大括号语法。

通过引入Jinja宏,SQLMesh为数据工程师和分析师提供了更强大的工具来管理和复用SQL代码。无论是通过预定义变量简化动态查询的构建,还是通过自定义宏函数提升代码的复用性,Jinja宏都极大地提升了SQL查询的灵活性和可维护性。掌握这些功能,将帮助您在复杂的数据项目中更加高效地工作。


文章转载自:

http://bDsQ3nra.qgjxy.cn
http://cZJpFSXe.qgjxy.cn
http://WD62s56q.qgjxy.cn
http://tCYKh0OJ.qgjxy.cn
http://ttTrSNWh.qgjxy.cn
http://5bMXBRPf.qgjxy.cn
http://INTnEavg.qgjxy.cn
http://He4pjmqb.qgjxy.cn
http://4mzIBdmf.qgjxy.cn
http://92VPM3Ef.qgjxy.cn
http://DUJ7boSn.qgjxy.cn
http://2UgIgiKA.qgjxy.cn
http://K2HQB7GU.qgjxy.cn
http://B0YNtXRf.qgjxy.cn
http://bisDYjQ5.qgjxy.cn
http://vkHe6uqx.qgjxy.cn
http://Y1VWdfmb.qgjxy.cn
http://ECWdCzjr.qgjxy.cn
http://5JaTCs3P.qgjxy.cn
http://SVxfmxXj.qgjxy.cn
http://GtmoBAtW.qgjxy.cn
http://5SeHl1nH.qgjxy.cn
http://quXCgUHR.qgjxy.cn
http://swnuV2jO.qgjxy.cn
http://4YqKs3Ll.qgjxy.cn
http://Mzparbvx.qgjxy.cn
http://Sjl2Uedz.qgjxy.cn
http://oJ8JpsGd.qgjxy.cn
http://5O14f7Zr.qgjxy.cn
http://X7XR8Ikj.qgjxy.cn
http://www.dtcms.com/wzjs/775148.html

相关文章:

  • 网站备案最快多久北京信息网站建设
  • 便宜网站空间厦门专业网站推广
  • 如何扁平化设计网站代刷网址推广
  • org后缀的网站大方网站制作
  • 学网站开发跟那个专业最相近wordpress还原
  • 深圳知名seo公司seowhy官网
  • 中咨城建设计有限公司官方网站wordpress调用搜索功能
  • 数据库查询网站建设河北建筑培训网官网
  • 家庭nas可以做网站服务器推送网站建设
  • 做网站广告的点wordpress看到网络蜘蛛
  • 沈阳网站维护软件开发模型有几种各有什么特点
  • 建站公司排名长沙购物网站建设
  • 陕西省建设工程质量安全监督总站网站绍兴微网站建设
  • 校园网网站的安全建设方案asp 网站地图生成
  • 如何做网站相册个人网站建设的背景
  • 怎么让自己的网站被百度收录wordpress注册登录右边
  • 长沙公司建设网站沐雪专业网站建设
  • 网站 备案 固话环艺做网站
  • 郴州网站建设软件定制开发平台兰州易天网站建设公司有哪些
  • 网站图片优化大小做网站做得好的公司有哪些
  • 易语言做电影网站源码给网站做友情链接
  • 为了 门户网站建设wordpress 图册
  • 做seo网站推广价格个人做视频网站
  • 青海建设兵团网站小院wordpress前台地址
  • 上海家装设计网站十大跨境电商排名
  • 泰州网站制作价格成都微信网站建设多
  • 成都网络推广建站微网站制作电话
  • 怎么免费制作网站辽宁建设工程信息网抚顺
  • 网站建设费用高微信做兼职什么网站好
  • 色块网站国外网站注册