目录

  • 1、Jinja模板功能介绍
    • 1.1 开启Jinja模板
    • 1.2 常用默认变量
    • 1.3 自定义Jinja上下文
    • 1.4 Jina模板默认值
    • 1.5 特殊过滤参数
    • 1.6 自定义模板
    • 1.7 宏
  • 2、实际应用示例
    • 2.1 设置动态时间传参
    • 2.2 设置的非时间格式的筛选参数
    • 2.3 设置的可识别操作并可模糊查询的参数
  • 3、 注意问题
    • 3.1 时间宏需填写参数
    • 3.2 时间宏需要在后续编辑时候写
    • 3.3 多选参数尽量选用图表格式的过滤器
    • 3.4 日期参数和多选参数的位置尽量放在一起
    • 3.5 SQL语句不能包含#号
    • 3.6 使用左侧自带的过滤器,可能导致日期函数没办法获取值

1、Jinja模板功能介绍

1.1 开启Jinja模板

代码开关:在/superset/config.py文件中,将 ENABLE_TEMPLATE_PROCESSING ,设置为True(默认为False)。

1.2 常用默认变量

columns: 查询中分组的列维度
filter: 查询中用到的筛选字段
from_dttm: 时间列筛选范围的起始时间
to_dttm: 时间列筛选范围的结束时间
groupby: 同columns但已经不推荐使用
metrics: 查询中的聚合字段
row_limit: 查询的行数限制
row_offset: 查询跳过的行数
table_columns: 数据集中可用的列
time_column: 查询的时间字段,没有则是undefined
time_grain: 所选的time grain ,没有则是undefined

示例:
设置开始时间、结束时间参数

SELECT *
FROM tbl
WHERE dttm_col > '{{ from_dttm }}' and dttm_col < '{{ to_dttm }}'

设置如果时间筛选栏没有值,则跳过:

SELECT *
FROM tbl
WHERE ({% if from_dttm is not none %}dttm_col > '{{ from_dttm }}' AND{% endif %}{% if to_dttm is not none %}dttm_col < '{{ to_dttm }}' AND{% endif %}true
)

1.3 自定义Jinja上下文

在superset_config.py文件设置,示例:

JINJA_CONTEXT_ADDONS = {'my_crazy_macro': lambda x: x*2,
}

1.4 Jina模板默认值

通过JSON的格式设置参数默认值,示例:

{"my_table": "foo"
}

1.5 特殊过滤参数

可用于测试jinja模板中使用的过滤器

{"_filters": [{"col": "action_type","op": "IN","val": ["sell", "buy"]}]
}
SELECT action, count(*) as times
FROM logs
WHERE action in {{ filter_values('action_type'))|where_in }}
GROUP BY action

1.6 自定义模板

通过使用CUSTOM_TEMPLATE_PROCESSSORS进行配置

def DATE(ts: datetime, day_offset: SupportsInt = 0, hour_offset: SupportsInt = 0
) -> str:"""Current day as a string."""day_offset, hour_offset = int(day_offset), int(hour_offset)offset_day = (ts + timedelta(days=day_offset, hours=hour_offset)).date()return str(offset_day)class CustomPrestoTemplateProcessor(PrestoTemplateProcessor):"""A custom presto template processor."""engine = "presto"def process_template(self, sql: str, **kwargs) -> str:"""Processes a sql template with $ style macro using regex."""# Add custom macros functions.macros = {"DATE": partial(DATE, datetime.utcnow())}  # type: Dict[str, Any]# Update with macros defined in context and kwargs.macros.update(self.context)macros.update(kwargs)def replacer(match):"""Expand $ style macros with corresponding function calls."""macro_name, args_str = match.groups()args = [a.strip() for a in args_str.split(",")]if args == [""]:args = []f = macros[macro_name[1:]]return f(*args)macro_names = ["$" + name for name in macros.keys()]pattern = r"(%s)\s*\(([^()]*)\)" % "|".join(map(re.escape, macro_names))return re.sub(pattern, replacer, sql)CUSTOM_TEMPLATE_PROCESSORS = {CustomPrestoTemplateProcessor.engine: CustomPrestoTemplateProcessor
}

SQL Lab还包括一个带有可插入后端的实时查询验证功能,可通过配置文件中添加:

FEATURE_FLAGS = {'SQL_VALIDATORS_BY_ENGINE': {'presto': 'PrestoDBSQLValidator',}
}

1.7 宏

{{ current_username() }} :返回当前登录用户的用户名。
{{ current_user_id() }} :返回当前登录用户的user_id。
{{ url_param(‘custom_variable’) }}:允许定义任意的URL参数,并在SQL代码中引用。
示例:

SELECT count(*)
FROM ORDERS
WHERE country_code = '{{ url_param('countrycode') }}'

可传递地区名称,以实现不同地区人打开报表后看到自己所属地区的内容。
如,对于在西班牙的同事,SQL Lab查询将呈现为:

SELECT count(*)
FROM ORDERS
WHERE country_code = 'ES'

对于在美国的同事,SQL Lab查询将呈现为:

SELECT count(*)
FROM ORDERS
WHERE country_code = 'US'

{{ cache_key_wrapper() }} :将一个值添加到缓存键计算中使用的值的累积列表中。

{{ filter_values() }:可以使用以列表形式检索特定筛选器的值
示例:

SELECT action, count(*) as times
FROM logs
WHEREaction in {{ filter_values('action_type')|where_in }}
GROUP BY action

where_in 将filter_values(‘action_type’)中的值列表转换为适用于in表达式的字符串。

将筛选器的值作为list引入,如:

SELECT action, count(*) as times
FROM logs
WHEREaction in ({{ "'" + "','".join(filter_values('action_type')) + "'" }})
GROUP BY action

{{ get_filters() }} :返回特定列的筛选器,类似filter_values(),但是可以返回Explore UI中指定的运算符。
示例:

 WITH RECURSIVEsuperiors(employee_id, manager_id, full_name, level, lineage) AS (SELECTemployee_id,manager_id,full_name,1 as level,employee_id as lineageFROMemployeesWHERE1=1{# Render a blank line #}{%- for filter in get_filters('full_name', remove_filter=True) -%}{%- if filter.get('op') == 'IN' -%}ANDfull_name IN {{ filter.get('val')|where_in }}{%- endif -%}{%- if filter.get('op') == 'LIKE' -%}ANDfull_name LIKE {{ "'" + filter.get('val') + "'" }}{%- endif -%}{%- endfor -%}UNION ALLSELECTe.employee_id,e.manager_id,e.full_name,s.level + 1 as level,s.lineageFROMemployees e,superiors sWHERE s.manager_id = e.employee_id)SELECTemployee_id, manager_id, full_name, level, lineageFROMsuperiorsorder by lineage, level

2、实际应用示例

2.1 设置动态时间传参

Superset默认不开启jinja模板功能,原来的查询是每次都全量查询后,再在前端过滤器增加过滤条件。如果原始sql数据量大,则会严重影响效率。
通过使用参数方式,可以实现从sql源头开始过滤,提高查询速度。

常用日期筛选器的宏:
from_dttm: 时间列筛选范围的起始时间
to_dttm: 时间列筛选范围的结束时间

示例:

SELECT *
FROM tablename
WHERE BeginDate > '{{ from_dttm }}'
AND BeginDate < '{{ to_dttm }}'

在运行SQL编辑器时,需要填写参数,否则会报错。
参数采用jason格式书写,示例:

{"from_dttm": "2023-03-01","to_dttm": "2023-05-01"
}

2.2 设置的非时间格式的筛选参数

一般用于非时间格式的字段筛选条件。
如:

SELECT *
FROM tablename
WHERE BeginDate > '{{ from_dttm }}'
AND BeginDate < '{{ to_dttm }}'
AND action in ('action_type1','action_type2')

可改写为:

SELECT *
FROM tablename
WHERE BeginDate > '{{ from_dttm }}'
AND BeginDate < '{{ to_dttm }}'
AND action in ({{ "'" + "', '".join(filter_values('action_type')) + "'" }})

2.3 设置的可识别操作并可模糊查询的参数

上述例子没有办法进行模糊匹配查询,可采用本方法。
如:

SELECT *
FROM tablename
WHERE BeginDate > '{{ from_dttm }}'
AND BeginDate < '{{ to_dttm }}'
AND action in ('action_type1','action_type2')

可改写为:

SELECT *
FROM tablename
WHERE BeginDate > '{{ from_dttm }}'
AND BeginDate < '{{ to_dttm }}'
{%- for filter in get_filters('action', remove_filter=True) -%}{%- if filter.get('op') == 'IN' -%}ANDPlanName IN ( {{ "'" + "', '".join(filter.get('val')) + "'" }} ){%- endif -%}{%- if filter.get('op') == 'LIKE' -%}ANDPlanName LIKE {{ "'" + filter.get('val') + "'" }}{%- endif -%}{%- endfor -%}

即可实现模糊匹配


3、 注意问题

3.1 时间宏需填写参数

如不填写参数,可能出现报错。

需要在此处填写参数,格式参考上一节:

3.2 时间宏需要在后续编辑时候写

我用的是2.0.0的版本,用上面这个参数的时候还发现一些问题,就是使用上述的方法没办法获得日期筛选器的传参,而是一直为上面步骤中写的参数值,无法跟着面板的筛选器一起变动。
解决的方法是:
1、在SQL编辑器中,先不写日期参数,生成查询结果后直接创建图表
2、在创建图表页面,点击编辑数据集,将日期函数添加上去,如图:

采用这个方法才能让参数获得切片器的值,可以用【检查查询】,排查时间参数是否来源于事件过滤器。

3.3 多选参数尽量选用图表格式的过滤器

尽量选用图表格式的过滤器,创建方式如图所示,选择图表类型为过滤器。
采用此种方法创建的过滤器,则多选栏的值都是可用的,没有冗余值。



3.4 日期参数和多选参数的位置尽量放在一起

如图所示,如果中间加入了普通的条件,会导致执行结果中的多选值,少了and,产生报错。


3.5 SQL语句不能包含#号

用#注释,会报错,用–做注释才可以。

3.6 使用左侧自带的过滤器,可能导致日期函数没办法获取值

需要使用图标格式的过滤器

【Superset】Jinja模板功能及设置动态参数相关推荐

  1. ROS机器人程序设计(原书第2版)3.4 设置动态参数

    3.4 设置动态参数 如果一个节点配置了一个动态重配置参数服务器,在工作中就可以使用rqt_reconfigure进行修改.运行下面的代码启动一个带有几个参数动态重配置的服务器(见功能包cfg文件夹中 ...

  2. [vue3+django]升级_权限功能+路由设置+动态路由

    一.背景 要对vue3项目进行升级,主要是添加用户权限,根据不同用户展示不同路由. 二.思路 1.对django后端进行处理,包括添加权限信息列 2.对后端登录接口进行处理,将权限信息通过respon ...

  3. postman 动态参数设置

    postman 动态参数设置 1.设置动态参数 2.生成参数脚本代码

  4. C++编写Config类ROS动态参数总结

    文章目录 1.C++编写Config类 1.1Config的头文件 1.2Config的cpp文件 1.3调用Config的类读取txt 2.ROS中的Config动态参数 2.1动态参数编写 2.2 ...

  5. Java vararg(动态参数)的应用

    可变参数在JDK 1.5添加,刚才知道的. 以下来自<Java泛型和集合>一书. 将参数打包成一个数组传入方法中是一件让人讨厌的事,在jdk1.5中加入了一个新的功能称为vararg(动态 ...

  6. Postman进阶篇动态参数、自定义动态参数及自定义动态参数全局变量断言

    postman全局变量设置动态参数 1.内置动态参数 2.自定义动态参数设置全局变量 3.自定义动态参数断言(精确断言) 1.内置动态参数 多接口关联时遇见传参数是动态的,这个时候给接口关联设置全局变 ...

  7. Vue3官网-可复用组合式API(十四)实例 property(\$slots,\$attrs)、渲染函数render(虚拟节点VNode,h() 参数,使用JavaScript代替模板功能),插件

    Vue3官网-可复用&组合式API(十四)实例 property($slots,$attrs).渲染函数render(虚拟节点VNode,h() 参数,使用JavaScript代替模板功能), ...

  8. finereport报表设计中模板数据集的sql语句中if的用法_报表工具中动态参数的灵活运用...

    报表开发过程中,有的时候我们会觉得普通参数很难满足一些业务需求,比如第二个数据集要引用第一个数据集的结果进行计算,动态控制 SQL 的过滤条件,动态列等,如果您遇到了这种情况,可以尝试使用动态参数即 ...

  9. [ROS]动态参数设置-可视化调试-创建cfg文件

    用途:调试时(尤其在导航和建图应用中)需要经常修改程序中的参数值,这时无论时修改命令行,还是编写固定修改参数的可执行文件,都无法满足要求.ROS为我们提供了动态参数设置机制. 一.创建cfg文件 创建 ...

最新文章

  1. 强化学习70年演进:从精确动态规划到基于模型
  2. 设计模式(19)-Observer Pattern
  3. python编程入门电子书下载-Python编程基础如何快速入门?“附电子书下载”
  4. java 实现斐波切纳数列,求解这个算斐波切纳兔子有关问题的算法错哪了(和stl迭代器貌似有点关系)...
  5. Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
  6. 字符串数组转换为整型数组
  7. Android一个漂亮的日历组件源码
  8. CCTV2《今日观察》:谷歌事件美国早有预谋
  9. 开源html5游戏-少年行
  10. 集成学习与随机森林练习题
  11. 高速公路车路协同创新示范情况全扫描(2021版)
  12. Android studio:select process to attach to...找不到debug调试的目录
  13. 图片太大怎么改小kb?简单的图片压缩方法分享
  14. 删除Mac中的Windows启动项
  15. Node节点禁止调度(平滑维护)方式- cordon,drain,delete
  16. 记一次 k8s 集群单点故障引发的血案
  17. mql4 c语言,MQL4基础:运算符和表达式 -
  18. 2016广东工业大学新生杯决赛
  19. MAC上配置搭配CH340/CH341 USB转串口芯片的Arduino
  20. 聚类模型——K-means聚类(SPSS)、层次聚类(SPSS)、DBSCAN聚类(MATLAB)

热门文章

  1. CSS3 线性渐变循环动画
  2. 大家都在用的抠图换背景软件,这些软件你知道几个?
  3. ubuntu下改变桌面图标大小方法
  4. prev_permutation 函数
  5. C语言关键字restrict(linux 中为 “__restrict”)
  6. redis之setnx、setex、setrange、mset
  7. 网页无法打开, 位于 https://xxx 的网页无法加载,因为:net::ERR_NAME_NOT_RESOLVED
  8. 2.5 纳什均衡的存在性
  9. 优秀的加密方案-软件加密技巧
  10. shell命令:打印除第一列外所有列