# Jinja Templating और Macros — Apache Airflow: Data Pipelines का Orchestration

Source: https://www.geekswithgeeks.com/hi/airflow/data-templating

> Tasks को run की तारीख़ पर निर्भर बनाने के लिए {{ ds }}, data_interval_start और params उपयोग करें।

## तारीख़ run की होती है

कई operator fields (जैसे `bash_command`, SQL files और paths) Jinja से **templated** होते हैं। Airflow run का वर्णन करने वाले variables देता है: `{{ ds }}` (logical date, YYYY-MM-DD), `{{ data_interval_start }}`, `{{ data_interval_end }}`, `{{ run_id }}`, `{{ params.x }}` और अन्य। `datetime.now()` की जगह इन्हें उपयोग करें ताकि पिछले दिन का re-run **उसी दिन** का डेटा प्रोसेस करे: यही idempotent, backfill-योग्य pipelines की नींव है। `@task` functions में वही मान arguments या context से पाएँ।

## तारीख़-जागरूक command और path

2026-09-15 के run को दोबारा चलाने पर सिर्फ़ partition `dt=2026-09-15` पढ़ा और लिखा जाता है।

```python
export_orders = BashOperator(
    task_id="export_orders",
    bash_command=(
        "python export.py --from '{{ data_interval_start | ds }}' "
        "--to '{{ data_interval_end | ds }}' "
        "--out s3://lake/orders/dt={{ ds }}/"
    ),
)
```

## व्यावसायिक तारीख़ों के लिए now() कभी नहीं

`datetime.now()` वह समय लौटाता है जब task संयोग से चलता है, जो retries और backfills पर बदलता है और चुपचाप ग़लत डेटा बनाता है। Run की अपनी तारीख़ें उपयोग करें।

**Quiz:** `{{ ds }}` आपको क्या देता है?

- [x] Run की logical date, YYYY-MM-DD रूप में
- [ ] मौजूदा घड़ी का समय
- [ ] DAG फ़ाइल का नाम
- [ ] एक random संख्या

*Answer:* Run की logical date, YYYY-MM-DD रूप में. यह run से जुड़ा है, इसलिए re-runs हर बार वही तारीख़ प्रोसेस करते हैं।
