NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #138 most downloaded on PyPI
psycopg2 - Python-PostgreSQL Database Adapter
Last release 25 days ago
09 Sep 2026
Ships fairly regularly
a new release about every 5 months
Nearly every release is documented
notes for 25 of 27 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
27 releases · first in 2018
What's new in psycopg 2.9.13 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
What's new in psycopg 2.9.13
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#1848).#1847).pyproject.toml file to declare a PEP 517 build backend#1788).#1848).#1847).pyproject.toml file to declare a PEP 517 build backend
(:ticket:#1788).What's new in psycopg 2.9.12 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
One column per quarter.
What's new in psycopg 2.9.12
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1835).1835).What's new in psycopg 2.9.11 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
What's new in psycopg 2.9.11
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#1791).~psycopg2.errorcodes map and ~psycopg2.errors classes updated to#1791).#1813).~psycopg2.errorcodes map and ~psycopg2.errors classes updated to
PostgreSQL 18.Add support for Python 3.14.
Avoid a segfault passing more arguments than placeholders if Python is built with assertions enabled (ticket #1791 ).
Add riscv64 platform binary packages (ticket #1813 ).
errorcodes map and errors classes updated to PostgreSQL 18.
Drop support for Python 3.8.
What's new in psycopg 2.9.10 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
What's new in psycopg 2.9.10
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#1728).~psycopg2.errorcodes map and ~psycopg2.errors classes updated toAdd support for Python 3.13.
Receive notifications on commit (ticket #1728 ).
errorcodes map and errors classes updated to PostgreSQL 17.
Drop support for Python 3.7.
Add support for Python 3.12. Drop support for Python 3.6.
Wheel package bundled with PostgreSQL 16 libpq in order to add support for recent features, such as sslcertmode .
sslcertmode.Fix propagation of exceptions raised during module initialization (:ticket: #1598 ).
#1598).#1599).#1598).#1599).Fix propagation of exceptions raised during module initialization (ticket #1598 ).
Fix building when pg_config returns an empty string (ticket #1599 ).
Wheel package bundled with OpenSSL 1.1.1v.
Package manylinux 2014 for aarch64 and ppc64le platforms, in order to include libpq 15 in the binary package (:ticket: #1396 ).
#1396).#1396).Package manylinux 2014 for aarch64 and ppc64le platforms, in order to include libpq 15 in the binary package (ticket #1396 ).
Wheel package bundled with OpenSSL 1.1.1t.
What's new in psycopg 2.9.5 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
What's new in psycopg 2.9.5
^^^^^^^^^^^^^^^^^^^^^^^^^^^
#1497).#1497).Add support for Python 3.11.
Add support for rowcount in MERGE statements in binary packages (ticket #1497 ).
Wheel package bundled with OpenSSL 1.1.1r and PostgreSQL 15 libpq.
What's new in psycopg 2.9.4 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
What's new in psycopg 2.9.4
^^^^^^^^^^^^^^^^^^^^^^^^^^^
~psycopg2.extras.register_composite(),~psycopg2.extras.register_range() with customized search_path#1487).pg_service.conf file in the /etc/postgresql-common`` directory in1365).~psycopg2.errorcodes map and ~psycopg2.errors classes updated to~psycopg2.extras.register_composite(),
~psycopg2.extras.register_range() with customized :sql:search_path
(:ticket:#1487).pg_service.conf file in the /etc/postgresql-common directory in
binary packages (:ticket:#1365).~psycopg2.errorcodes map and ~psycopg2.errors classes updated to
PostgreSQL 15.Fix register_composite() , register_range() with customized search_path (ticket #1487 ).
Handle correctly composite types with names or in schemas requiring escape.
Find pg_service.conf file in the /etc/postgresql-common directory in binary packages (ticket #1365 ).
errorcodes map and errors classes updated to PostgreSQL 15.
Wheel package bundled with OpenSSL 1.1.1q and PostgreSQL 14.4 libpq.
Alpine (musl) wheels now available (#1392).
#1392).1482).Alpine (musl) wheels now available (ticket #1392 ).
macOS arm64 (Apple M1) wheels now available (ticket 1482 ).
Raise ValueError for dates >= Y10k (#1307).
ValueError for dates >= Y10k (:ticket:#1307).~psycopg2.errorcodes map and ~psycopg2.errors classes updated to
PostgreSQL 14.#1376, #1386).#1388).Raise ValueError for dates >= Y10k (ticket #1307 ).
errorcodes map and errors classes updated to PostgreSQL 14.
Add preliminary support for Python 3.11 (tickets #1376 , #1386 ).
Wheel package bundled with OpenSSL 1.1.1l and PostgreSQL 14.1 libpq (ticket #1388 ).
The psycopg2.tz module is deprecated and scheduled to be dropped in the next major release.
~psycopg2.sql.Placeholder (:ticket:#1291).with connection starts a transaction on autocommit transactions too
(:ticket:#941).#1272).~cursor.copy_from() and
~cursor.copy_to().08XXX reclassified as
~psycopg2.OperationalError (a subclass of the previously used
~psycopg2.DatabaseError) (:ticket:#1148).#1200).Other changes:
#1198, #1000, #1197).datetime.timezone objects by default in datetime objects instead of
~psycopg2.tz.FixedOffsetTimezone.psycopg2.tz module is deprecated and scheduled to be dropped in the
next major release.599 wheels packages (manylinux2014 tag) for i686 and x86_64
platforms.600 wheels packages (manylinux_2_24 tag) for aarch64 and
ppc64le platforms.Fix regression with named Placeholder (ticket #1291 ).
with connection starts a transaction on autocommit transactions too (ticket #941 ).
Timezones with fractional minutes are supported on Python 3.7 and following (ticket #1272 ).
Escape table and column names in copy_from() and copy_to() .
Connection exceptions with sqlstate 08XXX reclassified as OperationalError (a subclass of the previously used DatabaseError ) (ticket #1148 ).
Include library dirs required from libpq to work around MacOS build problems (ticket #1200 ).
Other changes:
Dropped support for Python 2.7, 3.4, 3.5 (tickets #1198 , #1000 , #1197 ).
Dropped support for mx.DateTime.
Use datetime.timezone objects by default in datetime objects instead of FixedOffsetTimezone .
The psycopg2.tz module is deprecated and scheduled to be dropped in the next major release.
Provide PEP 599 wheels packages (manylinux2014 tag) for i686 and x86_64 platforms.
Provide PEP 600 wheels packages (manylinux_2_24 tag) for aarch64 and ppc64le platforms.
Wheel package bundled with OpenSSL 1.1.1k and PostgreSQL 13.3 libpq.
Build system for Linux/MacOS binary packages moved to GitHub Actions.
Nothing published for this version
Fixed memory leak changing connection encoding to the current one (#1101).
#1101).#996).#1133).cursor.query reports the query of the last :sql:COPY operation too
(:ticket:#1141).~psycopg2.errorcodes map and ~psycopg2.errors classes updated to
PostgreSQL 13.#1125).Fixed memory leak changing connection encoding to the current one (ticket #1101 ).
Fixed search of mxDateTime headers in virtualenvs (ticket #996 ).
Added missing values from errorcodes (ticket #1133 ).
cursor.query reports the query of the last COPY operation too (ticket #1141 ).
errorcodes map and errors classes updated to PostgreSQL 13.
Added wheel packages for ARM architecture (ticket #1125 ).
Wheel package bundled with OpenSSL 1.1.1g.
Fixed use of !connection_factory and !cursor_factory together (#1019).
!connection_factory and !cursor_factory together
(:ticket:#1019).~logging.LoggerAdapter in
~psycopg2.extras.LoggingConnection (:ticket:#1026).~psycopg2.extensions.Column objects in cursor.description can be sliced
(:ticket:#1034).#1061).~copy.copy() of ~psycopg2.extras.DictCursor rows (:ticket:#1073).Fixed use of connection_factory and cursor_factory together (ticket #1019 ).
Added support for LoggerAdapter in LoggingConnection (ticket #1026 ).
Column objects in cursor.description can be sliced (ticket #1034 ).
Added AIX support (ticket #1061 ).
Fixed copy() of DictCursor rows (ticket #1073 ).
Fixed building with Python 3.8 (#854).
#854).#898).#940).time.h on linux (:ticket:#951).~psycopg2.extensions.Column.table_oid
and ~psycopg2.extensions.Column.type_code (:ticket:#961).~psycopg2.errorcodes map and ~psycopg2.errors classes updated to
PostgreSQL 12.Fixed building with Python 3.8 (ticket #854 ).
Don’t swallow keyboard interrupts on connect when a password is specified in the connection string (ticket #898 ).
Don’t advance replication cursor when the message wasn’t confirmed (ticket #940 ).
Fixed inclusion of time.h on linux (ticket #951 ).
Fixed int overflow for large values in table_oid and type_code (ticket #961 ).
errorcodes map and errors classes updated to PostgreSQL 12.
Wheel package bundled with OpenSSL 1.1.1d and PostgreSQL at least 11.4.
Added *interval_status* parameter to ~psycopg2.extras.ReplicationCursor.start_replication() method and other facilities to send automatic replication
~psycopg2.extras.ReplicationCursor.start_replication() method and other
facilities to send automatic replication keepalives at periodic intervals
(:ticket:#913).#928).Added interval_status parameter to start_replication() method and other facilities to send automatic replication keepalives at periodic intervals (ticket #913 ).
Fixed namedtuples caching introduced in 2.8 (ticket #928 ).
Fixed ~psycopg2.extras.RealDictCursor when there are repeated columns (#884).
~psycopg2.extras.RealDictCursor when there are repeated columns
(:ticket:#884).#543, #836).Fixed RealDictCursor when there are repeated columns (ticket #884 ).
Binary packages built with openssl 1.1.1b. Should fix concurrency problems (tickets #543 , #836 ).
Dropped deprecated !register_tstz_w_secs() (was previously a no-op).
~psycopg2.extras.RealDictRow modifiability (:ticket:#886).#887).New features:
~psycopg2.errors module. Every PostgreSQL error is converted into
a specific exception class (:ticket:#682).~psycopg2.extensions.encrypt_password() function (:ticket:#576).~psycopg2.extensions.BYTES adapter to manage databases with mixed
encodings on Python 3 (:ticket:#835).~psycopg2.extensions.Column.table_oid and
~psycopg2.extensions.Column.table_column attributes on cursor.description
items (:ticket:#661).connection.info object to retrieve various PostgreSQL connection
information (:ticket:#726).~connection.get_native_connection() to expose the raw PGconn
structure to C extensions via Capsule (:ticket:#782).~connection.pgconn_ptr and ~cursor.pgresult_ptr to expose raw
C structures to Python and interact with libpq via ctypes (:ticket:#782).~psycopg2.sql.Identifier can represent qualified names in SQL composition
(:ticket:#732).!ReplicationCursor.\ ~psycopg2.extras.ReplicationCursor.wal_end
attribute (:ticket:#800).~psycopg2.extras.execute_values() function
(:ticket:#813).!str() on ~psycopg2.extras.Range produces a human-readable representation
(:ticket:#773).~psycopg2.extras.DictCursor and ~psycopg2.extras.RealDictCursor rows
maintain columns order (:ticket:#177).~psycopg2.extensions.Diagnostics.severity_nonlocalized attribute on
the ~psycopg2.extensions.Diagnostics object (:ticket:#783).~psycopg2.extras.NamedTupleCursor (:ticket:#838).Bug fixes:
#829).#856).~enum.IntEnum
(:ticket:#591).Other changes:
psycopg1 module.!register_tstz_w_secs() (was previously a no-op).!PersistentConnectionPool. This pool class was mostly
designed to interact with Zope. Use !ZPsycopgDA.pool instead.!PSYCOPG_DISPLAY_SIZE build parameter.!psycopg2.test package is no longer installed by python setup.py install.Fixed RealDictRow modifiability (ticket #886 ).
Fixed “there’s no async cursor” error polling a connection with no cursor (ticket #887 ).
New features:
Added errors module. Every PostgreSQL error is converted into a specific exception class (ticket #682 ).
Added encrypt_password() function (ticket #576 ).
Added BYTES adapter to manage databases with mixed encodings on Python 3 (ticket #835 ).
Added table_oid and table_column attributes on cursor.description items (ticket #661 ).
Added connection.info object to retrieve various PostgreSQL connection information (ticket #726 ).
Added get_native_connection() to expose the raw PGconn structure to C extensions via Capsule (ticket #782 ).
Added pgconn_ptr and pgresult_ptr to expose raw C structures to Python and interact with libpq via ctypes (ticket #782 ).
Identifier can represent qualified names in SQL composition (ticket #732 ).
Added ReplicationCursor . wal_end attribute (ticket #800 ).
Added fetch parameter to execute_values() function (ticket #813 ).
str() on Range produces a human-readable representation (ticket #773 ).
DictCursor and RealDictCursor rows maintain columns order (ticket #177 ).
Added severity_nonlocalized attribute on the Diagnostics object (ticket #783 ).
More efficient NamedTupleCursor (ticket #838 ).
Bug fixes:
Fixed connections occasionally broken by the unrelated use of the multiprocessing module (ticket #829 ).
Fixed async communication blocking if results are returned in different chunks, e.g. with notices interspersed to the results (ticket #856 ).
Fixed adaptation of numeric subclasses such as IntEnum (ticket #591 ).
Other changes:
Dropped support for Python 2.6, 3.2, 3.3.
Dropped psycopg1 module.
Dropped deprecated register_tstz_w_secs() (was previously a no-op).
Dropped deprecated PersistentConnectionPool . This pool class was mostly designed to interact with Zope. Use ZPsycopgDA.pool instead.
Binary packages no longer installed by default. The ‘psycopg2-binary’ package must be used explicitly.
Dropped PSYCOPG_DISPLAY_SIZE build parameter.
Dropped support for mxDateTime as the default date and time adapter. mxDatetime support continues to be available as an alternative to Python’s builtin datetime.
No longer use 2to3 during installation for Python 2 & 3 compatibility. All source files are now compatible with Python 2 & 3 as is.
The psycopg2.test package is no longer installed by python setup.py install .
Wheel package bundled with OpenSSL 1.0.2r and PostgreSQL 11.2 libpq.
Nothing published for this version
Cleanup of the cursor results assignment code, which might have solved double free and inconsistencies in concurrent usage (#346, #384).
#346, #384).Cleanup of the cursor results assignment code, which might have solved double free and inconsistencies in concurrent usage (tickets #346 , #384 ).
Wheel package bundled with OpenSSL 1.0.2q.
Fixed binary package broken on OS X 10.12 (#807).
#807).Fixed binary package broken on OS X 10.12 (ticket #807 ).
Wheel package bundled with PostgreSQL 11.1 libpq.
Close named cursors if exist, even if ~cursor.execute() wasn't called (#746).
~cursor.execute() wasn't called
(:ticket:#746).#755).COPY via ~cursor.execute() in asynchronous
connections (:ticket:#781).#788).~connection.readonly and
~connection.deferrable attributes repeatedly (:ticket:#790).~psycopg2.extras.execute_values() accepts ~psycopg2.sql.Composable
objects (:ticket:#794).~psycopg2.errorcodes map updated to PostgreSQL 11.Close named cursors if exist, even if execute() wasn’t called (ticket #746 ).
Fixed building on modern FreeBSD versions with Python 3.7 (ticket #755 ).
Fixed hang trying to COPY via execute() in asynchronous connections (ticket #781 ).
Fixed adaptation of arrays of empty arrays (ticket #788 ).
Fixed segfault accessing the connection’s readonly and deferrable attributes repeatedly (ticket #790 ).
execute_values() accepts Composable objects (ticket #794 ).
errorcodes map updated to PostgreSQL 11.
Wheel package bundled with PostgreSQL 10.5 libpq and OpenSSL 1.0.2p.
Allow non-ascii chars in namedtuple fields (regression introduced fixing #211).
#211).#325).#677).#658).#679).#716).Allow non-ascii chars in namedtuple fields (regression introduced fixing ticket #211 ).
Fixed adaptation of arrays of arrays of nulls (ticket #325 ).
Fixed building on Solaris 11 and derivatives such as SmartOS and illumos (ticket #677 ).
Maybe fixed building on MSYS2 (as reported in ticket #658 ).
Allow string subclasses in connection and other places (ticket #679 ).
Don’t raise an exception closing an unused named cursor (ticket #716 ).
Wheel package bundled with PostgreSQL 10.4 libpq and OpenSSL 1.0.2o.
Moving away from installing the wheel package by default. Packages installed from wheel raise a warning on import. Added package psycopg2-binary to in
psycopg2-binary to install from wheel instead (:ticket:#543).~psycopg2.extras.NamedTupleCursor (:ticket:#211).#532).cursor.mogrify() can be called on closed cursors (:ticket:#579).#580).~psycopg2.extras.MinTimeLoggingCursor on Python 3 (:ticket:#609).#613).~psycopg2.__libpq_version__ building with libpq >= 10.1
(:ticket:#632).~cursor.rowcount after ~cursor.executemany() with :sql:RETURNING
statements (:ticket:#633).#649).Moving away from installing the wheel package by default. Packages installed from wheel raise a warning on import. Added package psycopg2-binary to install from wheel instead (ticket #543 ).
Convert fields names into valid Python identifiers in NamedTupleCursor (ticket #211 ).
Fixed Solaris 10 support (ticket #532 ).
cursor.mogrify() can be called on closed cursors (ticket #579 ).
Fixed setting session characteristics in corner cases on autocommit connections (ticket #580 ).
Fixed MinTimeLoggingCursor on Python 3 (ticket #609 ).
Fixed parsing of array of points as floats (ticket #613 ).
Fixed libpq_version building with libpq >= 10.1 (ticket #632 ).
Fixed rowcount after executemany() with RETURNING statements (ticket #633 ).
Fixed compatibility problem with pypy3 (ticket #649 ).
Wheel packages bundled with PostgreSQL 10.1 libpq and OpenSSL 1.0.2n.
Wheel packages for Python 2.6 no more available (support dropped from wheel building infrastructure).
Wheel package bundled with PostgreSQL 10.0 libpq and OpenSSL 1.0.2l (#601, #602).
#601, #602).Wheel package bundled with PostgreSQL 10.0 libpq and OpenSSL 1.0.2l (tickets #601 , #602 ).
Your coding agent can read these notes before it upgrades. Set up the MCP server →