This package includes a managed connection for psycopg2 that provides
thread-safe exclusive access to an underlying psycopg2.connection object.
This allows many threads to share the same connection instance (avoiding the TCP and process startup cost associated with establishing a new PostgreSQL connection) and ensures that threads do not release the connection with a transaction still in progress -- either due to developer error, or an unhandled exception while a thread is interacting with the database.
ManagedConnection also will ensure that a connection that is closed upon
entering the managed context will be opened.
This package is released on PyPI as psycopg2-managed-connection and can be
installed via pip:
$ pip install psycopg2-managed-connection>>> from pgmanagedconnection import ManagedConnection
>>>
>>> dsn = 'postgres:///postgres' # a libpq connection string
>>> manager = ManagedConnection(dsn)
>>> manager
<ManagedConnection: postgres:///postgres (closed)>>>> with manager() as connection:
... cursor = connection.cursor()
... cursor.execute('SELECT 1')
... cursor.fetchone()
... connection.commit()
(1,)Leaving a transaction open when exiting the context manager will lead to a
RuntimeError. This also results in any open transactions implicitly being
rolled back.
>>> with manager() as connection:
... cursor = connection.cursor()
... cursor.execute('SELECT 1')
Traceback (most recent call last):
...
RuntimeError: Did not commit or rollback open transaction before releasing connection.The currently open transaction will be rolled back if an unhandled exception is encountered.
>>> import psycopg2
>>> with manager() as connection:
... cursor = connection.cursor()
... cursor.execute('SELECT 1')
... assert manager.status is psycopg2.extensions.TRANSACTION_STATUS_INTRANS
... raise NotImplementedError()
Traceback (most recent call last):
...
NotImplementedError
>>> manager.status is psycopg2.extensions.TRANSACTION_STATUS_IDLE
TrueThe test suite can be run with make test. This will run the test suite using
the version used by your local python command. You can force usage of python3
by running make test3.
It assumes a running and accessible PostgreSQL server. The connection details
are deferred to the underlying libpq implementation, and default values can
be specified using libpq environment variables.
tox is also supported as a test runner (if installed.)
$ export PGPORT=5432
$ docker run -dp $PGPORT:5432 postgres
$ PGUSER=postgres make testIf using boot2docker, the PGHOST environment variable will also need to be
set to the virtual machine IP address.
$ PGUSER=postgres PGHOST=$(boot2docker ip) make test