同时使用 Python f-strings 和 Jinja

cry*_*bhu 7 python jinja2 python-3.x

我正在尝试用 Python 编写一个简洁的 SQL 查询字符串,以同时使用 f-strings 和 Jinja。
背景信息:我正在编写一个在 Airflow 中使用的查询。

这不起作用:

query_string = f"""
        SELECT
            COUNT(DISTINCT case_id) AS counts
        FROM
            `{{var.value.gcp_project}}.{{var.value.dataset_prefix}}user.person`
        WHERE
            identified_on = PARSE_DATE('%Y-%m-%d', '{YESTERDAY_DATE_STR}')
           """
Run Code Online (Sandbox Code Playgroud)

它产生的查询字符串为:

SELECT
    COUNT(DISTINCT case_id) AS counts
FROM
    `{var.value.gcp_project}.{var.value.dataset_prefix}user.person`
WHERE
    identified_on = PARSE_DATE('%Y-%m-%d', '2020-09-07')
Run Code Online (Sandbox Code Playgroud)

所以它做了 f-string 值替换而不是 Jinja。

如何让 f-strings 和 Jinja 同时工作?

cry*_*bhu 8

我发现将大括号加倍{{}}起作用。
双大括号被转义为一个,因为 Jinja 需要其中的 2 个,所以 4 个括号就可以了。

所以这个查询:

query_string = f"""
        SELECT
            COUNT(DISTINCT case_id) AS counts
        FROM
            `{{{{var.value.gcp_project}}}}.{{{{var.value.dataset_prefix}}}}user.person`
        WHERE
            identified_on = PARSE_DATE('%Y-%m-%d', '{YESTERDAY_DATE_STR}')
           """
Run Code Online (Sandbox Code Playgroud)

返回格式正确的查询:

SELECT
    COUNT(DISTINCT case_id) AS counts
FROM
    `gcp_project.dataset_user.person`
WHERE
    identified_on = PARSE_DATE('%Y-%m-%d', '2020-09-07')
Run Code Online (Sandbox Code Playgroud)