migrating-airflow-2-to-3

Guide for migrating Apache Airflow 2.x projects to Airflow 3.x. Use when the user mentions Airflow 3 migration, upgrade, compatibility issues, breaking changes, or wants to modernize their Airflow codebase.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "migrating-airflow-2-to-3" with this command: npx skills add necatiarslan/airflow-vscode-extension/necatiarslan-airflow-vscode-extension-migrating-airflow-2-to-3

Airflow 2 to 3 Migration

This skill helps migrate Airflow 2.x DAG code to Airflow 3.x, focusing on code changes (imports, operators, hooks, context, API usage).

Important: Before migrating to Airflow 3, strongly recommend upgrading to Airflow 2.11 first, then to at least Airflow 3.0.11 (ideally 3.1).

Migration at a Glance

  1. Run Ruff Airflow migration rules:
    • ruff check --preview --select AIR --fix --unsafe-fixes .
  2. Scan for remaining issues using a manual checklist:
    • Direct metadata DB access
    • Legacy imports
    • Scheduling and context changes
    • XCom pickling
    • Datasets to assets
    • REST API and auth
    • Plugins and file paths
  3. Plan changes per file and issue type
  4. Implement changes incrementally and re-run Ruff
  5. Explain changes and advise testing

Architecture and Metadata DB Access

Airflow 3 changes how components talk to the metadata database:

  • Workers no longer connect directly to the metadata DB
  • Task code runs via the Task Execution API
  • The DAG processor is separate from the scheduler

Direct ORM access now fails with:

RuntimeError: Direct database access via the ORM is not allowed in Airflow 3.x

Patterns to search for

  • provide_session, create_session, @provide_session
  • from airflow.settings import Session
  • from airflow.settings import engine
  • ORM usage with models: session.query(DagModel)...

Replacement: Airflow Python client

Add to requirements.txt:

apache-airflow-client==<your-airflow-runtime-version>

Example:

import os
import airflow_client.client
from airflow_client.client.api.dag_api import DAGApi

_HOST = os.getenv("AIRFLOW__API__BASE_URL", "https://<your-org>.astronomer.run/<deployment>/")
_TOKEN = os.getenv("DEPLOYMENT_API_TOKEN")

config = airflow_client.client.Configuration(host=_HOST, access_token=_TOKEN)
with airflow_client.client.ApiClient(config) as api_client:
    dag_api = DAGApi(api_client)
    dags = dag_api.get_dags(limit=10)

Ruff Airflow Migration Rules

  • AIR30 / AIR301 / AIR302: removed code and imports
  • AIR31 / AIR311 / AIR312: deprecated code and imports

Commands:

ruff check --preview --select AIR --fix --unsafe-fixes .
ruff check --preview --select AIR .

Key Import Changes

Airflow 2.xAirflow 3
airflow.operators.dummy_operator.DummyOperatorairflow.providers.standard.operators.empty.EmptyOperator
airflow.operators.bash.BashOperatorairflow.providers.standard.operators.bash.BashOperator
airflow.operators.python.PythonOperatorairflow.providers.standard.operators.python.PythonOperator
airflow.decorators.dagairflow.sdk.dag
airflow.decorators.taskairflow.sdk.task
airflow.datasets.Datasetairflow.sdk.Asset

Context Key Changes

Removed KeyReplacement
execution_datecontext["dag_run"].logical_date
tomorrow_ds / yesterday_dsuse macros.ds_add
triggering_dataset_eventstriggering_asset_events
templates_dictcontext["params"]

Default Behavior Changes

SettingAirflow 2 DefaultAirflow 3 Default
scheduletimedelta(days=1)None
catchupTrueFalse

Resources

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

annotating-task-lineage

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

debugging-dags

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

testing-dags

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

tracing-downstream-lineage

No summary provided by upstream source.

Repository SourceNeeds Review