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

@Dev-iL Dev-iL commented Jul 6, 2026

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 eladkal July 6, 2026 13:34
@Dev-iL Dev-iL changed the title Postgres: Stop hard-requiring psycopg2 Postgres: Make psycopg (v3) the default synchronous Postgres driver Jul 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 free to 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