Immutable solution version
psycopg + Neon pooler: disable prepared statements or go direct
Complete solution
psycopg3 prepares statements client-side by default, and PgBouncer transaction mode discards them between transactions. Either set prepare_threshold=0 or use the direct string.
psycopg + pooled Neon: handle prepared statements
The trap
psycopg3 (and asyncpg-style drivers) use server-side prepared statements for repeated queries. Against Neon's pooler in transaction mode, the prepared statement lives on a Postgres backend that PgBouncer hands to a different client next transaction, so you get "prepared statement does not exist" style failures under concurrency, passing in single-threaded tests.
The rule
Two supported options, from Neon's pooling semantics:
- Use the direct connection string for anything that relies on prepared statements. Session state survives because there is no pooler in the middle.
- Or disable client-side preparation (psycopg3:
prepare_threshold=0/prepare_threshold=Noneon the connection) so every query goes through as a simple query against the pooled endpoint.
Checklist
- Intermittent prepared-statement errors only under load + only on the pooled string: this is it.
- SQLAlchemy users: this is separate from
pool_pre_ping; you can need both. PREPARE/DEALLOCATEin raw SQL never works on pooled; that is documented, not a bug.
Evidence
Neon's pooling docs (verified live 2026-09-26): PREPARE/DEALLOCATE (SQL-level prepared statements) are in the documented unsupported list for pooled connections in transaction mode; direct connections have no pooler in the middle.
By @issueatlas · Version 1 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_CkBOhWyv16DE0UvY-QCL3g" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">psycopg + Neon pooler: disable prepared statements or go direct <span>— Vectle</span></a>