Skip to main content

Context manager to run PostgreSQL queries with SQLAlchemy, terminating any other clients that block them

Project description

pg-force-execute

Context manager to run PostgreSQL queries with SQLAlchemy, terminating any other clients that continue to block it after a configurable delay.

Using this to wrap queries is somewhat of a last resort, but is useful in certain Extract Transform Load (ETL) pipeline contexts. For example, if it is more important to replace one table with another than to allow running queries on the table to complete, then this can be used to run the relevant ALTER TABLE RENAME TO query.

Installation

pip install pg-force-execute

Example usage

import datetime
import sqlalchemy as sa
from pg_force_execute import pg_force_execute

# Run postgresql locally should allow the below to run
# docker run --rm -it -e POSTGRES_HOST_AUTH_METHOD=trust -p 5432:5432 postgres

engine = sa.create_engine('postgresql://postgres@127.0.0.1:5432/')
query = 'SELECT 1'  # A more realistic example would be something that needs an exclusive lock on a table

with \
        engine.begin() as conn, \
        pg_force_execute(
            conn,           # SQLAlchemy connection to run the query
            engine,         # SQLAlchemy engine that will create new connections to cancel blocking queries
            delay=datetime.timedelta(minutes=5),  # Amount of time to wait before cancelling queries
        ):

    results = conn.execute(query)
    print(results.fetchall())

API

The API a single context manager pg_force_execute.

pg_force_execute(conn, engine, delay=datetime.timedelta(minutes=5), check_interval=datetime.timedelta(seconds=1), termination_thread_timeout=datetime.timedelta(seconds=10), logger=logging.getLogger("pg_force_execute"))

  • conn - A SQLAlchemy connection that will be unblocked

  • engine - A SQLAlchemy engine to create a new connection that will be used to terminate backends blocking conn

  • delay (optional) - How long to wait before attempting to terminate backends blocking conn

  • check_interval (optional) - The interval between repeated attempted to terminate backends blocking conn

  • termination_thread_timeout (optional) - How long to wait for the termination to complete

  • logger (optional) The Python logger instance through which to log

Running tests locally

pip install -e ".[dev]"  # Only needed once
./start-services.sh      # Only needed once
pytest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pg_force_execute-0.0.6.tar.gz (4.3 kB view details)

Uploaded Source

Built Distribution

pg_force_execute-0.0.6-py3-none-any.whl (4.2 kB view details)

Uploaded Python 3

File details

Details for the file pg_force_execute-0.0.6.tar.gz.

File metadata

  • Download URL: pg_force_execute-0.0.6.tar.gz
  • Upload date:
  • Size: 4.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.0

File hashes

Hashes for pg_force_execute-0.0.6.tar.gz
Algorithm Hash digest
SHA256 ecd65e4c867a135819819d4dc37c7b00281b0b1ae1d00483b10fd6f10bb44604
MD5 aa6429b74c079c0e9c9c57cbd3af326b
BLAKE2b-256 cb92a064b5685b730f101ae91066e4a925db85435fc2374f0cd952de5af592f5

See more details on using hashes here.

File details

Details for the file pg_force_execute-0.0.6-py3-none-any.whl.

File metadata

File hashes

Hashes for pg_force_execute-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 204d2a43a0eb1577df6f26cc249d7043c745743df9d43d9e8ef353599c0e11c7
MD5 051671d74799d1df301d4c076e151eef
BLAKE2b-256 d559ed103ff51cfdb7a7ef68c12b67ac80b11c29e4dc2395b1984e6a99f2d658

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page