Skip to content

Postgres: Make psycopg (v3) the default synchronous Postgres driver - #69474

Closed
Dev-iL wants to merge 1 commit into
apache:mainfrom
Dev-iL:psycopg3-sync-postgres
Closed

Postgres: Make psycopg (v3) the default synchronous Postgres driver#69474
Dev-iL wants to merge 1 commit into
apache:mainfrom
Dev-iL:psycopg3-sync-postgres

Conversation

@Dev-iL

Copy link
Copy Markdown
Collaborator

related:

Mirrors the async default switch: PostgresHook no longer requires psycopg2 at import time. psycopg2-binary moves from a hard dependency to a new [psycopg2] optional extra.

What changed

  • providers/postgres/pyproject.toml: psycopg2-binary moved from dependencies into a new "psycopg2" optional-dependencies extra, with its existing version constraints preserved. The apache-airflow>=2.11.0 floor and the "sqlalchemy" extra are unchanged. uv.lock regenerated.
  • providers/postgres/src/airflow/providers/postgres/hooks/postgres.py: the psycopg2 connection/cursor/execute_values imports are now lazy/guarded (same try/except pattern already used for the psycopg3 import). The module imports successfully even when psycopg2 isn't installed, and any call site that genuinely needs the psycopg2 path raises a clear AirflowOptionalProviderFeatureException instead of failing at import time. USE_PSYCOPG3/is_sqla2 dual-path logic is otherwise unchanged.
  • providers/postgres/README.rst / docs/index.rst: regenerated to include the new [psycopg2] extra.
  • providers/postgres/docs/changelog.rst: new "Breaking changes" note describing the sync default change and the remediation (pip install apache-airflow-providers-postgres[psycopg2]).

Test plan

  • New/updated tests in providers/postgres/tests/unit/postgres/hooks/test_postgres.py simulate psycopg2 being absent (sys.modules patching) and confirm the module still imports, while each of the three guarded call sites (_get_cursor, _create_connection, insert_rows(fast_executemany=True)) raises the clear, actionable error rather than a bare traceback.

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Code Sonnet 5 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@Dev-iL
Dev-iL requested review from ashb, dabla and eladkal and removed request for eladkalJuly 6, 2026 13:34
@Dev-iLDev-iL changed the title Postgres: Stop hard-requiring psycopg2Postgres: Make psycopg (v3) the default synchronous Postgres driverJul 6, 2026
@Dev-iL
Dev-iL marked this pull request as draft July 6, 2026 15:03
Mirrors the async default switch (apache#69089): PostgresHook no longer
requires psycopg2 at import time. The psycopg2-specific connection,
cursor, and execute_values imports are now lazy/guarded and raise a
clear AirflowOptionalProviderFeatureException if psycopg2 genuinely
needs to be used but isn't installed. psycopg2-binary moves to a new
[psycopg2] extra.
Part of the migration tracked in apache#68453.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Dev-iL