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
Or install from Python using the SQL script shipped with this package:
from pgmq import install_pgmq_from_sql
install_pgmq_from_sql(
host="localhost",
port="5432",
username="postgres",
password="postgres",
database="postgres",
)
SQL-only install does not support extension versioning or upgrades. Prefer
CREATE EXTENSION pgmq when the host allows custom extensions.
Installation
pip install pgmq
Optional backends:
| Extra | Backend |
|---|---|
pgmq[async] |
asyncpg |
pgmq[sqlalchemy] |
SQLAlchemy (sync) |
pgmq[sqlalchemy-async] |
SQLAlchemy (async) |
pgmq[fastapi] |
FastAPI HTTP API (python -m pgmq.api) |
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
- Getting Started — Installation, Docker setup, and first messages
- Configuration — Environment variables and connection strings
- Clients — Choosing and initializing backends
- Transactions — Transaction decorators and manual connections
- Topic Routing — Pattern-based message routing
- Notifications — Real-time NOTIFY/LISTEN listeners
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
Metadata
Release files for pgmq 1.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pgmq-1.1.4.tar.gz | 61.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pgmq-1.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 135.4 kB
Release files / pgmq-1.1.4.tar.gz
| Download URL | pgmq-1.1.4.tar.gz |
|---|---|
| Size | 61.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bbbe21ea69a7a574ed691f7dac62a485cad0e7e1c0dee6dc8daaf6e23cf3ada6
|
|
BLAKE2b-256 checksum How to use checksums |
fc5e63d8ba7a6cdec6389d23e5372f2012f4d9d78db64849ed6762b238badbd6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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}
|
Release files / pgmq-1.1.4-py3-none-any.whl
| Download URL | pgmq-1.1.4-py3-none-any.whl |
|---|---|
| Size | 73.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d9e7aa517295669d46a11d3d13106efbdc738d0e127d84c567b6d4c936e7d1d
|
|
BLAKE2b-256 checksum How to use checksums |
54ab8a862610348af8a14a7b4238de233bb798eb6cc6d975f17297834c4eea31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","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}
|