je voudrais utiliser la date d'exécution comme paramètre dans mon fichier sql:
j'ai essayé
dt = '{{ ds }}'
s3_to_redshift = PostgresOperator(
task_id='s3_to_redshift',
postgres_conn_id='redshift',
sql='s3_to_redshift.sql',
params={'file': dt},
dag=dag
)
mais ça ne marche pas.
dt = '{{ ds }}'
Ne fonctionne pas car Jinja (le moteur de modèle utilisé dans le flux d'air) ne traite pas l'intégralité du fichier de définition Dag.
Pour chaque Operator
il y a des champs que Jinja traitera, qui font partie de la définition de l'opérateur lui-même.
Dans ce cas, vous pouvez créer le champ params
(qui est en fait appelé parameters
, assurez-vous de le modifier) comme modèle si vous étendez le PostgresOperator
comme ceci:
class MyPostgresOperator(PostgresOperator):
template_fields = ('sql','parameters')
Vous devriez maintenant pouvoir faire:
s3_to_redshift = MyPostgresOperator(
task_id='s3_to_redshift',
postgres_conn_id='redshift',
sql='s3_to_redshift.sql',
parameters={'file': '{{ ds }}'},
dag=dag
)
PostgresOperator/JDBCOperator héritent de BaseOperator.
L'un des paramètres d'entrée de BaseOperator est params: self.params = params or {} # Available in templates!
Ainsi, vous devriez pouvoir l'utiliser sans créer de nouvelle classe:
(même si params n'est pas inclus dans template_fields) t1 = JdbcOperator( task_id='copy', sql='copy.sql', jdbc_conn_id='connection_name', params={'schema_name':'public'}, dag=dag )
L'instruction SQL (copy.sql) peut ressembler à: copy {{ params.schema_name }}.table_name from 's3://.../table_name.csv' iam_role 'arn:aws:iam::<acc_num>:role/<role_name>' csv IGNOREHEADER 1
Remarque:
copy.sql réside au même emplacement que le DAG.
OU
vous pouvez définir la variable "template_searchpath" dans "default_args"
et spécifiez le chemin absolu vers le dossier où réside le fichier modèle.
Par exemple: 'template_searchpath': '/ home/user/airflow/templates /'