如何通过 jinja2 中的查找字典过滤列表
How do I filter a list through a lookup dictionary in jinja2
如何过滤 jinja2 中的列表以通过查找生成值列表table?
我有一种情况是使用 Jinja2 生成 SQL。我有一个值列表,我想用基于查找的转换值列表替换它们:
start_values = ['a', 'c']
lookup_table = {
'a': {
'table_x': '11111',
'table_y': '22222'
},
'b': {
'table_x': '33333',
'table_y': '44444'
},
'c': {
'table_x': '55555',
'table_y': '66666'
}
}
在我的模板中,我希望能够使用过滤器而不是循环来执行类似这样的操作:
GROUP BY
{% for col in start_values %}
{{ lookup_table[col]['table_x'] }},
{% endif %}
结尾的逗号将导致 SQL 格式不正确。
我想避免创建客户过滤器,但我还没有遇到可以按我需要的方式查找字典引用的过滤器:
{{ start_values|some_lookup_method(lookup_table)|map(attribute='table_x')|join(', ') }}
我无法将 map(attribute=*)
用于 some_lookup_method
,因为我不知道如何访问来自 start_values
的密钥。大多数在线示例都是针对 Ansible 的,并使用扁平结构,如下所示。我不想要那个结构,所以请不要回答那个格式。
# Answers for this format are already plentiful on the Internet
lookup_table = [
{
'name': 'a',
'table_x': '11111',
'table_y': '22222'
},
# ...
]
遗憾的是,在本机 Jinja 中没有这样的过滤器来过滤字典或从字典中创建列表,就像您为 Ansible 找到的答案一样,它们使用 dict2items
。
这就是说,使用 loop.last
,您可以有条件地添加或不添加逗号:
GROUP BY
{%- for col in start_values %}
{{ lookup_table[col].table_x }}{% if not loop.last %},{% endif %}
{%- endfor %}
会给你
GROUP BY
11111,
55555
如何过滤 jinja2 中的列表以通过查找生成值列表table?
我有一种情况是使用 Jinja2 生成 SQL。我有一个值列表,我想用基于查找的转换值列表替换它们:
start_values = ['a', 'c']
lookup_table = {
'a': {
'table_x': '11111',
'table_y': '22222'
},
'b': {
'table_x': '33333',
'table_y': '44444'
},
'c': {
'table_x': '55555',
'table_y': '66666'
}
}
在我的模板中,我希望能够使用过滤器而不是循环来执行类似这样的操作:
GROUP BY
{% for col in start_values %}
{{ lookup_table[col]['table_x'] }},
{% endif %}
结尾的逗号将导致 SQL 格式不正确。
我想避免创建客户过滤器,但我还没有遇到可以按我需要的方式查找字典引用的过滤器:
{{ start_values|some_lookup_method(lookup_table)|map(attribute='table_x')|join(', ') }}
我无法将 map(attribute=*)
用于 some_lookup_method
,因为我不知道如何访问来自 start_values
的密钥。大多数在线示例都是针对 Ansible 的,并使用扁平结构,如下所示。我不想要那个结构,所以请不要回答那个格式。
# Answers for this format are already plentiful on the Internet
lookup_table = [
{
'name': 'a',
'table_x': '11111',
'table_y': '22222'
},
# ...
]
遗憾的是,在本机 Jinja 中没有这样的过滤器来过滤字典或从字典中创建列表,就像您为 Ansible 找到的答案一样,它们使用 dict2items
。
这就是说,使用 loop.last
,您可以有条件地添加或不添加逗号:
GROUP BY
{%- for col in start_values %}
{{ lookup_table[col].table_x }}{% if not loop.last %},{% endif %}
{%- endfor %}
会给你
GROUP BY
11111,
55555