Skip to main content

Python client for the PGMQ Postgres extension.

Project description

PGMQ Python Client

PyPI Python Versions Downloads License

The official Python client for PGMQ.

📖 Documentation  ·  💻 Source


What is PGMQ?

A lightweight message queue. Like AWS SQS and RSMQ but on Postgres.

PGMQ (Postgres Message Queue) is a message queue built on Postgres. It provides reliable, transactional message processing with the familiarity of SQL. The pgmq Python library exposes a clean, unified API for interacting with PGMQ across four different database backends.


Prerequisites

A running PostgreSQL instance with the PGMQ extension installed.

Docker (recommended)

The fastest way to get started is with the pre-built Docker image:

docker run -d --name pgmq-postgres \
  -e POSTGRES_PASSWORD=postgres \
  -p 5432:5432 \
  ghcr.io/pgmq/pg18-pgmq:latest

Then connect and enable PGMQ:

psql postgres://postgres:postgres@localhost:5432/postgres -c "CREATE EXTENSION pgmq;"

SQL Only

You can also install PGMQ's objects directly into the pgmq schema. Use this on hosted Postgres services that do not support custom extensions.

git clone https://github.com/pgmq/pgmq.git
cd pgmq
psql -f pgmq-extension/sql/pgmq.sql postgres://postgres:postgres@localhost:5432/postgres

Installation

pip install pgmq

Optional backends:

Extra Backend
pgmq[async] asyncpg
pgmq[sqlalchemy] SQLAlchemy (sync)
pgmq[sqlalchemy-async] SQLAlchemy (async)

Features

Lightweight — No background workers or external dependencies. Just Postgres SQL objects.

Exactly-once delivery — Guaranteed delivery to a single consumer within a visibility timeout.

Four identical APIs — Swap between sync (psycopg), async (asyncpg), sync SQLAlchemy, and async SQLAlchemy with minimal changes.

Queue management — Create, drop, list, purge, and partition queues.

Message operations — Send, read, archive, delete, pop. Batch operations for high throughput.

FIFO queues — Ordered processing with message group keys.

Topic routing — Pattern-based bindings for publish-subscribe and content-based routing.

Visibility timeouts — Control how long a message stays hidden after reading.

Notifications — PostgreSQL NOTIFY/LISTEN for real-time message arrival events.

Transactions — Decorators and manual connection injection for complex workflows.

Structured logging — stdlib logging with optional loguru backend.


Documentation


Quick Start

Sync (psycopg):

from pgmq import PGMQueue

queue = PGMQueue()  # reads PG_* env vars by default

# Create a queue
queue.create_queue("my_queue")

# Send a message
msg_id = queue.send("my_queue", {"hello": "world"})

# Send a batch
batch_ids = queue.send_batch("my_queue", [{"foo": "bar"}, {"baz": "qux"}])

# Read with 30s visibility timeout
msg = queue.read("my_queue", vt=30)
print(msg.message)  # {'hello': 'world'}

# Archive when done
queue.archive("my_queue", msg.msg_id)

Async (asyncpg):

from pgmq import AsyncPGMQueue

queue = AsyncPGMQueue()
await queue.init()

# Create a queue
await queue.create_queue("my_queue")

# Send a message
msg_id = await queue.send("my_queue", {"hello": "world"})

# Send a batch
batch_ids = await queue.send_batch("my_queue", [{"foo": "bar"}, {"baz": "qux"}])

# Read with 30s visibility timeout
msg = await queue.read("my_queue", vt=30)
print(msg.message)  # {'hello': 'world'}

# Archive when done
await queue.archive("my_queue", msg.msg_id)

Development

# Install dependencies
uv sync --all-groups --all-extras

# Run tests (spins up Docker Postgres automatically)
make test

# Run lints
make lint

# Serve docs locally
make docs-serve

License

Apache-2.0

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

pgmq-1.1.2.tar.gz (29.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pgmq-1.1.2-py3-none-any.whl (36.6 kB view details)

Uploaded Python 3

File details

Details for the file pgmq-1.1.2.tar.gz.

File metadata

  • Download URL: pgmq-1.1.2.tar.gz
  • Upload date:
  • Size: 29.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pgmq-1.1.2.tar.gz
Algorithm Hash digest
SHA256 bc96286132728166ae121ac41bbb84b0b1eafcd8b707682761217ab8b10c0a8d
MD5 077d3aad490eb5de0be4b65bd58b7b7c
BLAKE2b-256 48ff3f33e9e591383db4cac0dc0f410711e9f6a7c515ea96d2ef4b07c385b1b4

See more details on using hashes here.

File details

Details for the file pgmq-1.1.2-py3-none-any.whl.

File metadata

  • Download URL: pgmq-1.1.2-py3-none-any.whl
  • Upload date:
  • Size: 36.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pgmq-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f80da34f6346837958ad491b48c6b735482767cfced2f97eb40e465f6937ff0b
MD5 615dba8ae947bdef8cd9ecbdcf465b05
BLAKE2b-256 0ed51a3a57e383ade539cf23dd6e2118e23626c141dda6d3f15af95a8f86d747

See more details on using hashes here.

Supported by

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