es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Apache Airflow: Pasar una variable en la inclusión jinja

Actualmente estoy utilizando la siguiente declaración en Apache airflow:

s10_test_load = bigquery.BigQueryInsertJobOperator(
    task_id="10_test_load",
    configuration={
        "query": {
            "query": "{% include './scripts/10_test_load.sql' %}",
            "useLegacySql": False,
        },
    },
)

Esta declaración está funcionando correctamente y está ejecutando el SQL desde el archivo de script.

Me gustaría usar dinámicamente el nombre de archivo desde una variable de la siguiente manera:

file_name = './scripts/10_test_load.sql'

s10_test_load = bigquery.BigQueryInsertJobOperator(
    task_id="10_test_load",
    configuration={
        "query": {
            "query": "{% include file_name %}",
            "useLegacySql": False,
        },
    },
)

¿Cómo puedo pasar una variable de Python dentro de un include de Jinja?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para pasar una variable de Python dentro de una inclusión de jinja, podemos usar el módulo jinja2.Template para crear una cadena de plantilla que incluya la variable y luego renderizar esta cadena de plantilla para obtener la consulta SQL final.

    Aquí tienes un ejemplo de cómo modificar el código anterior:

    from jinja2 import Template
    
    file_name = './scripts/10_test_load.sql'
    
    with open(file_name) as f:
        query_template = Template(f.read())
    
    query = query_template.render()
    
    s10_test_load = bigquery.BigQueryInsertJobOperator(
        task_id="10_test_load",
        configuration={
            "query": {
                "query": query,
                "useLegacySql": False,
            },
        },
    )
    

    En el código anterior, primero abrimos el archivo de script SQL usando with open(file_name) as f: – esto abre el archivo y crea un objeto de archivo f.

    Luego, usamos Template del módulo jinja2 para crear un objeto de plantilla query_template a partir del contenido del archivo.

    A continuación, renderizamos la plantilla usando el método render(), pasando las variables necesarias como argumentos de palabras clave.

    Finalmente, utilizamos la cadena de consulta renderizada para crear el objeto BigQueryInsertJobOperator.

    De esta manera, podemos generar dinámicamente la consulta SQL a partir de un nombre de archivo almacenado en una variable de Python.

Comments are closed.