pypg-iam
Python library for pg-iam.
Installation
Basic installation (sync only)
pip install pypg-iam
# or
poetry add pypg-iam
This installs dependencies required for the synchronous API only, which uses SQLAlchemy and psycopg2.
Installation with async support
Note: Async support requires SQLAlchemy 2.0 or higher. The synchronous API works with SQLAlchemy 1.4+.
# Install with all async database drivers: psycopg 3 will be used by default
pip install pypg-iam[async]
# or
poetry add pypg-iam[async]
# or
uv add pypg-iam[async]
# Install with only psycopg 3 (the most widely used PostgreSQL driver for Python, recommended)
pip install pypg-iam[async-psycopg]
# Alternative: only asyncpg (optimized for performance)
pip install pypg-iam[async-asyncpg]
This will install SQLAlchemy 2.x with async support and async database libraries for it to use. It's recommended to pick a specific database driver for your project instead of adding everything, but the "async" dependency group is provided for convenience.
Features
- Synchronous API: Traditional blocking operations using SQLAlchemy
- Async API (optional): Native async/await support using SQLAlchemy's asyncio extension with psycopg 3 or asyncpg for modern async frameworks (FastAPI, aiohttp, etc.)
Usage
Synchronous
from iam import Db, iam_engine
dsn = "postgresql://user:pw@host:5432/dbname"
engine = iam_engine(dsn)
db = Db(engine)
# Query data
result = db.exec_sql("select * from persons where name=:name", {'name': 'Alice'})
groups = db.person_groups(person_id)
Asynchronous
import asyncio
from iam import AsyncDb, async_iam_engine
async def main():
dsn = "postgresql://user:pw@host:5432/dbname"
# Auto-detect: tries psycopg 3 first, then asyncpg
engine = async_iam_engine(dsn)
# Or explicitly request a specific driver:
# engine = async_iam_engine(dsn, driver='psycopg') # psycopg 3
# engine = async_iam_engine(dsn, driver='asyncpg') # asyncpg
db = AsyncDb(engine)
# Query data
result = await db.exec_sql("select * from persons where name=:name", {'name': 'Alice'})
groups = await db.person_groups(person_id)
# Clean up
await engine.dispose()
asyncio.run(main())
Choosing an async driver
Both psycopg 3 and asyncpg are supported. Choose based on your needs:
pypg-iam[async-psycopg]- psycopg 3.x (default)- The most widely used PostgreSQL driver, full feature coverage
pypg-iam[async-asyncpg]- asyncpg- Faster, optimized for high-throughput applications
When calling async_iam_engine(dsn, driver='auto') (auto keyword being the
default), pypg-iam will use psycopg 3 if available, otherwise asyncpg. If you
explicitly request a driver that isn't installed, you'll get an ImportError with
installation instructions.
Tests
Tests use pytest-postgresql to automatically set up a temporary PostgreSQL database with pg-iam schemas. No manual database setup required!
Prerequisites
The test suite automatically:
- Clones the pg-iam repository to get schema files
- Starts a temporary PostgreSQL server
- Installs pg-iam schemas
- Runs tests
- Cleans up everything
You just need PostgreSQL binaries installed on your system (psql, initdb, etc.).
Running tests
# Install all dependencies including test and async extras
uv sync --all-extras
# Run all tests (sync + async with both psycopg and asyncpg drivers)
uv run pytest -v
# Run only sync tests
uv run pytest tests/test_sync.py -v
# Run only async tests
uv run pytest tests/test_async.py -v
# Run async tests with a specific driver
uv run pytest tests/test_async.py::TestAsyncPgIam::test_async_pgiam[psycopg] -v
uv run pytest tests/test_async.py::TestAsyncPgIam::test_async_pgiam[asyncpg] -v
Testing against an existing database (optional)
The test fixtures automatically detect and use an existing pg-iam database if you set these environment variables:
# Set postgres environment variables
export PYPGIAM_USER="your_user"
export PYPGIAM_PW="your_password" # Optional, defaults to empty string
export PYPGIAM_HOST="localhost"
export PYPGIAM_DB="your_db"
# Run tests - they'll use your database instead of creating a temporary one
uv run pytest -v
Note: When using a manual database, the tests expect pg-iam schemas to already be installed. The automated schema installation only happens with pytest-postgresql's temporary databases.
LICENSE
BSD.
Metadata
Release files for pypg-iam 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pypg_iam-0.8.0.tar.gz | 18.6 kB | Without provenance | Details for pypg_iam-0.8.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pypg_iam-0.8.0-py3-none-any.whl | Python 3 | none | any | Details for pypg_iam-0.8.0-py3-none-any.whl |
Total release size: 39.1 kB
Release files / pypg_iam-0.8.0.tar.gz
| Download URL | pypg_iam-0.8.0.tar.gz |
|---|---|
| Size | 18.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
23e85eef65073cc6181144fcddee3c364c8590dd23728776303133e362298df5
|
|
BLAKE2b-256 checksum How to use checksums |
ff01f5e934dfc4331f99d92f000ef02066cfdbaf49dcf30c4e5034577d40f8a6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Release files / pypg_iam-0.8.0-py3-none-any.whl
| Download URL | pypg_iam-0.8.0-py3-none-any.whl |
|---|---|
| Size | 20.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
604484bd01a5f2e133fee3ff40248f5e2dfe25861e7a71891362de197dfebec7
|
|
BLAKE2b-256 checksum How to use checksums |
fa50b33394a7d62088f8c833bea9fe027bd827b7550689bd41be376785ab8fe4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Security for pypg-iam 0.8.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.