Skip to main content

Low-level PostgreSQL wire protocol (3.0 & 3.2) codec for Python

Project description

🐘 pygwire 🐍

A low-level PostgreSQL wire protocol codec for Python

CI Python 3.11+ License: MIT PyPI

[!NOTE] Beta. Pygwire is under active development. The API may change between minor releases until 1.0. See the changelog for migration notes.


Pygwire is a sans-I/O PostgreSQL wire protocol (v3.0 and v3.2) codec. All codec and state machine logic is I/O-independent, making it portable across asyncio, trio, synchronous sockets, or any other transport.

✨ Features

  • Sans-I/O design. No I/O dependencies. Bring your own transport.
  • Zero-copy parsing. Uses memoryview for buffer slicing.
  • Complete protocol coverage. All PostgreSQL v3.0 and v3.2 wire protocol messages with connection phase tracking.
  • Zero dependencies. No runtime dependencies.
  • Fully typed. Ships with py.typed marker for PEP 561 support.

📦 Installation

pip install pygwire

Or with uv:

uv add pygwire

🚀 Quick Start

📖 Read the full documentation →

from pygwire import BackendMessageDecoder
from pygwire.messages import Query, ParameterStatus

# Encode a client message to wire bytes
query = Query(query_string="SELECT * FROM users")
wire_bytes = query.to_wire()  # b'Q\x00\x00\x00\x18SELECT * FROM users\x00'

# Decode server messages from raw bytes
decoder = BackendMessageDecoder()
decoder.feed(ParameterStatus(name="server_version", value="16.1").to_wire())

for msg in decoder:
    print(msg)  # ParameterStatus(name='server_version', value='16.1')

🏗️ Architecture

Pygwire is organized into four layers, from low-level to high-level:

Layer Module Purpose
Messages pygwire.messages Encode and decode all PostgreSQL protocol messages
Codec pygwire.codec Incremental stream decoder with zero-copy framing
State Machine pygwire.state_machine Connection phase tracking for framing, disambiguation, and lifecycle
Connection pygwire.connection Coordinated decoder + state machine (sans-I/O)

Use the lower layers independently for maximum control, or use Connection for a higher-level API that coordinates them together.

[!NOTE] Pygwire follows PostgreSQL's naming convention: backend = server, frontend = client.

📋 Requirements

  • Python 3.11+
  • No runtime dependencies

📚 Documentation

📖 Full documentation, tutorials, and API reference →

Additional Resources

🤝 Contributing

See CONTRIBUTING.md for development setup and guidelines.

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

pygwire-0.2.0.tar.gz (29.2 kB view details)

Uploaded Source

Built Distribution

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

pygwire-0.2.0-py3-none-any.whl (36.2 kB view details)

Uploaded Python 3

File details

Details for the file pygwire-0.2.0.tar.gz.

File metadata

  • Download URL: pygwire-0.2.0.tar.gz
  • Upload date:
  • Size: 29.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.11 {"installer":{"name":"uv","version":"0.10.11","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 pygwire-0.2.0.tar.gz
Algorithm Hash digest
SHA256 cf7acf697d7d161b4732805d6b48e3242097ca17708a607de25d889ba2feb245
MD5 044163e70d7a1907fb85766815c135cb
BLAKE2b-256 15b1858d26b05f3b789b0fd604e6ad8b321b26455768a389405ba48f3ba2c0de

See more details on using hashes here.

File details

Details for the file pygwire-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: pygwire-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 36.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.11 {"installer":{"name":"uv","version":"0.10.11","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 pygwire-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d6a662930e9fa10ea9af47f4ec30a675fed6f16bd6b7e947f498aadd575bf5a0
MD5 b8b64cbf2abca4e7d0be4d761ae0eebf
BLAKE2b-256 32fade8f41b0744660d92ede8e413a8c855472137c5e9c3e1a5e783ca7d19aef

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