NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #362 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
Most releases are documented
notes for 52 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
16 years old
66 releases · first in 2010
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 ).
Dropped libresolv from wheel package to avoid incompatibility with glibc 2.26 (wheels ticket #2).
Restored default timestamptz[] typecasting to Python !datetime. Regression introduced in Psycopg 2.7.2 (#578).
timestamptz[] typecasting to Python !datetime.
Regression introduced in Psycopg 2.7.2 (:ticket:#578).Restored default timestamptz[] typecasting to Python datetime . Regression introduced in Psycopg 2.7.2 (ticket #578 ).
Fixed inconsistent state in externally closed connections (#263, #311, #443). Was fixed in 2.6.2 but not included in 2.7 by mistake.
#263, #311, #443). Was fixed in 2.6.2 but not included in
2.7 by mistake.#410).connection.dsn when the connection
string is specified as an URI (:ticket:#528).timestamptz
(:ticket:#536).#541).~connection.lobject() when mode=\ !None
(:ticket:#544).~connection.lobject() keyword argument lobject_factory
(:ticket:#545).~psycopg2.extras.ReplicationCursor.consume_stream()
keepalive_interval argument (:ticket:#547).#550).!SystemError upon receiving abort signal (:ticket:#551).~psycopg2.sql.Composable objects in
~psycopg2.extras.ReplicationCursor.start_replication_expert()
(:ticket:#554).#558).~psycopg2.extras.Json !prepare() method to consider connection
params when adapting (:ticket:#562).~psycopg2.errorcodes map updated to PostgreSQL 10 beta 1.Fixed inconsistent state in externally closed connections (tickets #263 , #311 , #443 ). Was fixed in 2.6.2 but not included in 2.7 by mistake.
Fixed Python exceptions propagation in green callback (ticket #410 ).
Don’t display the password in connection.dsn when the connection string is specified as an URI (ticket #528 ).
Return objects with timezone parsing “infinity” timestamptz (ticket #536 ).
Dropped dependency on VC9 runtime on Windows binary packages (ticket #541 ).
Fixed segfault in lobject() when mode = None (ticket #544 ).
Fixed lobject() keyword argument lobject_factory (ticket #545 ).
Fixed consume_stream() keepalive_interval argument (ticket #547 ).
Maybe fixed random import error on Python 3.6 in multiprocess environment (ticket #550 ).
Fixed random SystemError upon receiving abort signal (ticket #551 ).
Accept Composable objects in start_replication_expert() (ticket #554 ).
Parse intervals returned as microseconds from Redshift (ticket #558 ).
Added Json prepare() method to consider connection params when adapting (ticket #562 ).
errorcodes map updated to PostgreSQL 10 beta 1.
When not enabled, convert arrays of network types to lists by default. The old !Inet adapter is deprecated (#317, #343, #387).
Ignore !None arguments passed to ~psycopg2.connect() and ~psycopg2.extensions.make_dsn() (#517).
OpenSSL upgraded from major version 0.9.8 to 1.0.2 in the Linux wheel packages (#518).
Fixed build with libpq versions < 9.3 (#520).
New features:
Added ~psycopg2.sql module to generate SQL dynamically (#308).
Added replication-support (#322). Main authors are Oleksandr Shulgin and Craig Ringer, who deserve a huge thank you.
Added ~psycopg2.extensions.parse_dsn() and ~psycopg2.extensions.make_dsn() functions (#321, #363). ~psycopg2.connect() now can take both dsn and keyword arguments, merging them together.
Added ~psycopg2.__libpq_version__ and ~psycopg2.extensions.libpq_version() to inspect the version of the libpq library the module was bundled with (#35, #323).
The attributes ~connection.notices and ~connection.notifies can be customized replacing them with any object exposing an !append() method (#326).
Adapt network types to ipaddress objects when available. When not enabled, convert arrays of network types to lists by default. The old !Inet adapter is deprecated (#317, #343, #387).
Added ~psycopg2.extensions.quote_ident() function (#359).
Added ~connection.get_dsn_parameters() connection method (#364).
~cursor.callproc() now accepts a dictionary of parameters (#381).
Give precedence to !__conform__() over superclasses to choose an object adapter (#456).
Using Python C API decoding functions and codecs caching for faster unicode encoding/decoding (#473).
~cursor.executemany() slowness addressed by ~psycopg2.extras.execute_batch() and ~psycopg2.extras.execute_values() (#491).
Added async_ as an alias for async to support Python 3.7 where async will become a keyword (#495).
Unless in autocommit, do not use default_transaction_* settings to control the session characteristics as it may create problems with external connection pools such as pgbouncer; use BEGIN options instead (#503).
~connection.isolation_level is now writable and entirely separated from ~connection.autocommit; added ~connection.readonly, ~connection.deferrable writable attributes.
Bug fixes:
Throw an exception trying to pass NULL chars as parameters (#420).
Fixed error caused by missing decoding ~psycopg2.extras.LoggingConnection (#483).
Fixed integer overflow in interval seconds (#512).
Make ~psycopg2.extras.Range objects picklable (#462).
Fixed version parsing and building with PostgreSQL 10 (#489).
Other changes:
Dropped support for Python 2.5 and 3.1.
Dropped support for client library older than PostgreSQL 9.1 (but older server versions are still supported).
~connection.isolation_level doesn't read from the database but will return ~psycopg2.extensions.ISOLATION_LEVEL_DEFAULT if no value was set on the connection.
Empty arrays no more converted into lists if they don't have a type attached (#506)
Ignore None arguments passed to connect() and make_dsn() (ticket #517 ).
OpenSSL upgraded from major version 0.9.8 to 1.0.2 in the Linux wheel packages (ticket #518 ).
Fixed build with libpq versions < 9.3 (ticket #520 ).
New features:
Added sql module to generate SQL dynamically (ticket #308 ).
Added Replication protocol support (ticket #322 ). Main authors are Oleksandr Shulgin and Craig Ringer, who deserve a huge thank you.
Added parse_dsn() and make_dsn() functions (tickets #321 , #363 ). connect() now can take both dsn and keyword arguments, merging them together.
Added libpq_version and libpq_version() to inspect the version of the libpq library the module was bundled with (tickets #35 , #323 ).
The attributes notices and notifies can be customized replacing them with any object exposing an append() method (ticket #326 ).
Adapt network types to ipaddress objects when available. When not enabled, convert arrays of network types to lists by default. The old Inet adapter is deprecated (tickets #317 , #343 , #387 ).
Added quote_ident() function (ticket #359 ).
Added get_dsn_parameters() connection method (ticket #364 ).
callproc() now accepts a dictionary of parameters (ticket #381 ).
Give precedence to conform() over superclasses to choose an object adapter (ticket #456 ).
Using Python C API decoding functions and codecs caching for faster unicode encoding/decoding (ticket #473 ).
executemany() slowness addressed by execute_batch() and execute_values() (ticket #491 ).
Added async_ as an alias for async to support Python 3.7 where async will become a keyword (ticket #495 ).
Unless in autocommit, do not use default_transaction_* settings to control the session characteristics as it may create problems with external connection pools such as pgbouncer; use BEGIN options instead (ticket #503 ).
isolation_level is now writable and entirely separated from autocommit ; added readonly , deferrable writable attributes.
Bug fixes:
Throw an exception trying to pass NULL chars as parameters (ticket #420 ).
Fixed error caused by missing decoding LoggingConnection (ticket #483 ).
Fixed integer overflow in interval seconds (ticket #512 ).
Make Range objects picklable (ticket #462 ).
Fixed version parsing and building with PostgreSQL 10 (ticket #489 ).
Other changes:
Dropped support for Python 2.5 and 3.1.
Dropped support for client library older than PostgreSQL 9.1 (but older server versions are still supported).
isolation_level doesn’t read from the database but will return ISOLATION_LEVEL_DEFAULT if no value was set on the connection.
Empty arrays no more converted into lists if they don’t have a type attached (ticket #506 )
Nothing published for this version
Fixed inconsistent state in externally closed connections (#263, #311, #443).
#263, #311, #443).#281).!NotSupportedError on unhandled server response status
(:ticket:#352).#331).~psycopg2.extras.wait_select callback allows interrupting a
long-running query in an interactive shell using :kbd:Ctrl-C
(:ticket:#333).!PersistentConnectionPool on Python 3 (:ticket:#348).repr() of an unitialized connection (:ticket:#361).~psycopg2.extensions.QuotedString on Python 3
(:ticket:#365).#370).#380).!errorcodes.lookup initialization thread-safety (:ticket:#382).!read() exception propagation in copy_from (:ticket:#412).#424).~psycopg2.errorcodes map updated to PostgreSQL 9.5.Fixed inconsistent state in externally closed connections (tickets #263 , #311 , #443 ).
Report the server response status on errors (such as ticket #281 ).
Raise NotSupportedError on unhandled server response status (ticket #352 ).
Allow overriding string adapter encoding with no connection (ticket #331 ).
The wait_select callback allows interrupting a long-running query in an interactive shell using Ctrl - C (ticket #333 ).
Fixed PersistentConnectionPool on Python 3 (ticket #348 ).
Fixed segfault on repr() of an unitialized connection (ticket #361 ).
Allow adapting bytes using QuotedString on Python 3 (ticket #365 ).
Added support for setuptools/wheel (ticket #370 ).
Fix build on Windows with Python 3.5, VS 2015 (ticket #380 ).
Fixed errorcodes.lookup initialization thread-safety (ticket #382 ).
Fixed read() exception propagation in copy_from (ticket #412 ).
Fixed possible NULL TZ decref (ticket #424 ).
errorcodes map updated to PostgreSQL 9.5.
Lists consisting of only None are escaped correctly (#285).
None are escaped correctly (:ticket:#285).#290).#294).!MinTimeLoggingCursor.callproc() (:ticket:#309).#350).New features:
time objects with a tzinfo specified and PostgreSQL :sql:timetz
data are converted into each other (:ticket:#272).Bug fixes:
!str() returns the adapted content instead of the !repr()
(:ticket:#191).Lists consisting of only None are escaped correctly (ticket #285 ).
Fixed deadlock in multithread programs using OpenSSL (ticket #290 ).
Correctly unlock the connection after error in flush (ticket #294 ).
Fixed MinTimeLoggingCursor.callproc() (ticket #309 ).
Added support for MSVC 2015 compiler (ticket #350 ).
New features:
Added support for large objects larger than 2GB. Many thanks to Blake Rouse and the MAAS Team for the feature development.
Python time objects with a tzinfo specified and PostgreSQL timetz data are converted into each other (ticket #272 ).
Bug fixes:
Json adapter’s str() returns the adapted content instead of the repr() (ticket #191 ).
Nothing published for this version
Named cursors used as context manager don't swallow the exception on exit (#262).
#262).cursor.description can be pickled (:ticket:#265).#270).#278).Named cursors used as context manager don’t swallow the exception on exit (ticket #262 ).
cursor.description can be pickled (ticket #265 ).
Propagate read error messages in COPY FROM (ticket #270 ).
PostgreSQL time 24:00 is converted to Python 00:00 (ticket #278 ).
Added jsonb support for PostgreSQL 9.4 (#226).
jsonb support for PostgreSQL 9.4 (:ticket:#226).~cursor.execute() instead
of using the proper methods (:ticket:#219).#220).WITH HOLD don't begin a new transaction upon move/fetch/close
(:ticket:#228).WITH HOLD can be used in autocommit (:ticket:#229).~cursor.callproc() doesn't silently ignore an argument without a length.#256)._psycopg.so module can be imported stand-alone (to
allow modules juggling such as the one described in :ticket:#201).Added jsonb support for PostgreSQL 9.4 (ticket #226 ).
Fixed segfault if COPY statements are passed to execute() instead of using the proper methods (ticket #219 ).
Force conversion of pool arguments to integer to avoid potentially unbounded pools (ticket #220 ).
Cursors WITH HOLD don’t begin a new transaction upon move/fetch/close (ticket #228 ).
Cursors WITH HOLD can be used in autocommit (ticket #229 ).
callproc() doesn’t silently ignore an argument without a length.
Fixed memory leak with large objects (ticket #256 ).
Make sure the internal _psycopg.so module can be imported stand-alone (to allow modules juggling such as the one described in ticket #201 ).
Work around pip issue #1630 __ making installation via pip -e git+url impossible (#18).
pip issue #1630 <https://github.com/pypa/pip/issues/1630>__
making installation via pip -e git+url impossible (:ticket:#18).cursor.rowcount attribute
(:ticket:#180).get_transaction_status() on closed connections.#188).poll() (from :ticket:#192
discussion)#192 discussion).Range objects, thanks to
Chris Withers (:ticket:#193).#194). Thanks to
Adam Petrovich for the bug report and diagnosis.#195).#196).#203).cursor_factory=None in
connection.cursor() (:ticket:#210).Work around pip issue #1630 making installation via pip -e git+url impossible (ticket #18 ).
Copy operations correctly set the cursor.rowcount attribute (ticket #180 ).
It is now possible to call get_transaction_status() on closed connections.
Fixed unsafe access to object names causing assertion failures in Python 3 debug builds (ticket #188 ).
Mark the connection closed if found broken on poll() (from ticket #192 discussion)
Fixed handling of dsn and closed attributes in connection subclasses failing to connect (from ticket #192 discussion).
Added arbitrary but stable order to Range objects, thanks to Chris Withers (ticket #193 ).
Avoid blocking async connections on connect (ticket #194 ). Thanks to Adam Petrovich for the bug report and diagnosis.
Don’t segfault using poorly defined cursor subclasses which forgot to call the superclass init (ticket #195 ).
Mark the connection closed when a Socket connection is broken, as it happens for TCP connections instead (ticket #196 ).
Fixed overflow opening a lobject with an oid not fitting in a signed int (ticket #203 ).
Fixed handling of explicit default cursor_factory=None in connection.cursor() (ticket #210 ).
Fixed possible segfault in named cursors creation.
Fixed debug build on Windows, thanks to James Emerton.
Fixed segfault pickling the exception raised on connection error (#170).
#170).#173).lobject with the wrong parameter doesn't segfault
(:ticket:#187).Fixed segfault pickling the exception raised on connection error (ticket #170 ).
Meaningful connection errors report a meaningful message, thanks to Alexey Borzenkov (ticket #173 ).
Manually creating lobject with the wrong parameter doesn’t segfault (ticket #187 ).
Fixed build on Solaris 10 and 11 where the round() function is already declared (#146).
Fixed build on Solaris 10 and 11 where the round() function is already declared (#146).
Fixed comparison of Range with non-range objects (#164). Thanks to Chris Withers for the patch.
Fixed double-free on connection dealloc (#166). Thanks to Gangadharan S.A. for the report and fix suggestion.
New features:
Added JSON adaptation.
Added support for PostgreSQL 9.2 range types.
connection and cursor objects can be used in with statements as context managers as specified by recent |DBAPI|_ extension.
Added ~psycopg2.extensions.Diagnostics object to get extended info from a database error. Many thanks to Matthew Woodcraft for the implementation (#149).
Added connection.cursor_factory attribute to customize the default object returned by ~connection.cursor().
Added support for backward scrollable cursors. Thanks to Jon Nelson for the initial patch (#108).
Added a simple way to customize casting of composite types into Python objects other than namedtuples. Many thanks to Ronan Dunklau and Tobias Oberstein for the feature development.
connection.reset() implemented using DISCARD ALL on server versions supporting it.
Bug fixes:
Properly cleanup memory of broken connections (#148).
Fixed bad interaction of setup.py with other dependencies in Distribute projects on Python 3 (#153).
Other changes:
Added support for Python 3.3.
Dropped support for Python 2.4. Please use Psycopg 2.4.x if you need it.
~psycopg2.errorcodes map updated to PostgreSQL 9.2.
Dropped Zope adapter from source repository. ZPsycopgDA now has its own project at <https://github.com/psycopg/ZPsycopgDA>.
Fixed build on Solaris 10 and 11 where the round() function is already declared (ticket #146 ).
Fixed comparison of Range with non-range objects (ticket #164 ). Thanks to Chris Withers for the patch.
Fixed double-free on connection dealloc (ticket #166 ). Thanks to Gangadharan S.A. for the report and fix suggestion.
New features:
Added JSON adaptation .
Added support for PostgreSQL 9.2 range types .
connection and cursor objects can be used in with statements as context managers as specified by recent DB API 2.0 extension.
Added Diagnostics object to get extended info from a database error. Many thanks to Matthew Woodcraft for the implementation (ticket #149 ).
Added connection.cursor_factory attribute to customize the default object returned by cursor() .
Added support for backward scrollable cursors. Thanks to Jon Nelson for the initial patch (ticket #108 ).
Added a simple way to customize casting of composite types into Python objects other than namedtuples. Many thanks to Ronan Dunklau and Tobias Oberstein for the feature development.
connection.reset() implemented using DISCARD ALL on server versions supporting it.
Bug fixes:
Properly cleanup memory of broken connections (ticket #148 ).
Fixed bad interaction of setup.py with other dependencies in Distribute projects on Python 3 (ticket #153 ).
Other changes:
Added support for Python 3.3.
Dropped support for Python 2.4. Please use Psycopg 2.4.x if you need it.
errorcodes map updated to PostgreSQL 9.2.
Dropped Zope adapter from source repository. ZPsycopgDA now has its own project at < https://github.com/psycopg/ZPsycopgDA >.
Nothing published for this version
Fixed 'cursor()' arguments propagation in connection subclasses and overriding of the 'cursor_factory' argument. Thanks to Corry Haines for the report
#105).#110).#113).#114).#123, #125, #142).#131).#133).#135).#140).#141).Fixed ‘cursor()’ arguments propagation in connection subclasses and overriding of the ‘cursor_factory’ argument. Thanks to Corry Haines for the report and the initial patch (ticket #105 ).
Dropped GIL release during string adaptation around a function call invoking a Python API function, which could cause interpreter crash. Thanks to Manu Cupcic for the report (ticket #110 ).
Close a green connection if there is an error in the callback. Maybe a harsh solution but it leaves the program responsive (ticket #113 ).
‘register_hstore()’, ‘register_composite()’, ‘tpc_recover()’ work with RealDictConnection and Cursor (ticket #114 ).
Fixed broken pool for Zope and connections re-init across ZSQL methods in the same request (tickets #123 , #125 , #142 ).
connect() raises an exception instead of swallowing keyword arguments when a connection string is specified as well (ticket #131 ).
Discard any result produced by ‘executemany()’ (ticket #133 ).
Fixed pickling of FixedOffsetTimezone objects (ticket #135 ).
Release the GIL around PQgetResult calls after COPY (ticket #140 ).
Fixed empty strings handling in composite caster (ticket #141 ).
Fixed pickling of DictRow and RealDictRow objects.
The close() methods on connections and cursors don't raise exceptions if called on already closed objects.
#84).#88).#90).#94, #95).#100).#103).The close() methods on connections and cursors don’t raise exceptions if called on already closed objects.
Fixed fetchmany() with no argument in cursor subclasses (ticket #84 ).
Use lo_creat() instead of lo_create() when possible for better interaction with pgpool-II (ticket #88 ).
Error and its subclasses are picklable, useful for multiprocessing interaction (ticket #90 ).
Better efficiency and formatting of timezone offset objects thanks to Menno Smits (tickets #94 , #95 ).
Fixed ‘rownumber’ during iteration on cursor subclasses. Regression introduced in 2.4.4 (ticket #100 ).
Added support for ‘inet’ arrays.
Fixed ‘commit()’ concurrency problem (ticket #103 ).
Codebase cleaned up using the GCC Python plugin’s static analysis tool, which has revealed several unchecked return values, possible NULL dereferences, reference counting problems. Many thanks to David Malcolm for the useful tool and the assistance provided using it.
'register_composite()' also works with the types implicitly defined after a table row, not only with the ones created by 'CREATE TYPE'.
#80).#73).#82).connect() supports all the keyword arguments supported by the database
#66).#52).#62).#65).#64).#67).#68).#81).connect() supports all the keyword arguments supported by the database
Added ‘new_array_type()’ function for easy creation of array typecasters.
Added support for arrays of hstores and composite types (ticket #66 ).
Fixed segfault in case of transaction started with connection lost (and possibly other events).
Fixed adaptation of Decimal type in sub-interpreters, such as in certain mod_wsgi configurations (ticket #52 ).
Rollback connections in transaction or in error before putting them back into a pool. Also discard broken connections (ticket #62 ).
Lazy import of the slow uuid module, thanks to Marko Kreen.
Fixed NamedTupleCursor.executemany() (ticket #65 ).
Fixed –static-libpq setup option (ticket #64 ).
Fixed interaction between RealDictCursor and named cursors (ticket #67 ).
Dropped limit on the columns length in COPY operations (ticket #68 ).
Fixed reference leak with arguments referenced more than once in queries (ticket #81 ).
Fixed typecasting of arrays containing consecutive backslashes.
‘errorcodes’ map updated to PostgreSQL 9.1.
Added 'set_session()' method and 'autocommit' property to the connection. Added support for read-only sessions and, for PostgreSQL 9.1, for the "repea
#55).#53).#57).#58, Red Hat Bug 711095).Use own parser for bytea output, not requiring anymore the libpq 9.0 to parse the hex format.
#46).#48).New features and changes:
Added support for Python 3.1 and 3.2. The conversion has also brought several improvements:
Improvements to the named cursors:
Improvements in data handling:
Other changes:
Bug fixes:
#26). Bug
report by Karsten Hilbert.#30). Bug report and patch by Pumukel.#40). Bug report and
patch by Marti Raudsepp.Nothing published for this version
Fixed segfault with middleware not passing DateStyle to the client (#24). Bug report and patch by Marti Raudsepp.
#24). Bug report and patch by Marti Raudsepp.Fixed segfault with middleware not passing DateStyle to the client (ticket #24 ). Bug report and patch by Marti Raudsepp.
Dropped deprecated Psycopg "own quoting".
#23).psycopg 2.3 aims to expose some new features introduced in PostgreSQL 9.0.
Main new features:
dict to hstore adapter and hstore to dict typecaster, using both
9.0 and pre-9.0 syntax.namedtuple-returning cursor.Other features and changes:
mogrify() now supports unicode queries.errorcodes knows a couple of new codes introduced in PostgreSQL 9.0.Bug fixes:
PQfreemem instead of free in binary typecaster.conn_get_isolation_level().#7).#9).Nothing published for this version
psycopg now correctly handles time zones with seconds in the UTC offset. The old register_tstz_w_secs() function is deprecated and will raise a warnin…
Bux fixes:
psycopg now builds again on MS Windows.
Bux fixes:
This is the first release of the new 2.2 series, supporting not just one but two different ways of executing asynchronous queries, thanks to Jan and Daniele (with a little help from me and others, but they did 99% of the work so they deserve their names here in the news.)
psycopg now supports both classic select() loops and "green" coroutine libraries. It is all in the documentation, so just point your browser to doc/html/advanced.html.
Other new features:
Bug fixes:
Nothing published for this version
Support for adapting tuples to PostgreSQL arrays is now enabled by default and does not require importing psycopg2.extensions anymore.
New features:
Bug fixes:
It seems we're good citizens of the free software ecosystem and that big big big companies and people ranting on the pgsql-hackers mailing list we'll now not dislike us. g (See LICENSE file for the details.)
It is now possible to build psycopg linking to a static libpq library.
New features:
Bug fixes:
The connection object now has a reset() method that can be used to reset the connection to its default state.
New features:
Bug fixes:
DictRow and RealDictRow now use less memory. If you inherit on them remember to set __slots__ for your new attributes or be prepare to go back to old
New features:
Bug fixes:
A specialized type-caster that can parse time zones with seconds is now available. Note that after enabling it (see extras.py) "wrong" time zones will
New features:
Bug fixes:
The connection object now has a get_backend_pid() method that returns the current PostgreSQL connection backend process PID.
New features:
Bug fixes:
Your coding agent can read these notes before it upgrades. Set up the MCP server →