Skip to main content

polydb

PyPI Python License

One async API for PostgreSQL, MongoDB, SQLite, and MySQL.

Source: https://github.com/Genius740Code/polydb

polydb gives application code a single async API for CRUD, schema, transactions, and raw-query escape hatches, backed by three adapters (Postgres, Mongo, and a SQL-generic family covering SQLite + MySQL). Switching backends is a connection-string change — see the planning document for the full support matrix and build order.

Current status

Planned, not fully built. Implemented so far (planning doc §1.1 Connection management + §1.2 Create + §1.3 Read):

Feature Status
Database.from_url(url) -> Database — factory resolves every supported scheme to its adapter instance ✅ Done
connect() / disconnect() / ping() / async context manager ✅ Done (SQLite leg; ping returns False instead of raising on an unreachable backend)
pool_size, timeout query params ✅ Done — validated at parse time, exposed as db.pool_size / db.timeout; SQLite accepts-and-ignores non-default pool_size with a warning (single-writer file)
insert_one(collection, doc) → InsertResult ✅ Done (SQLite leg; inserted_id = rowid)
insert_many(collection, docs) → InsertManyResult ✅ Done (SQLite leg; heterogeneous docs fill missing columns with NULL; one commit, all-or-nothing)
upsert_one(collection, filter, doc) → UpsertResult ✅ Done (SQLite leg; Mongo-style match-first-row-or-insert semantics — filter fields merge into the inserted row, doc wins on key conflicts)
find_one(collection, filter) → dict | None ✅ Done (SQLite leg; full Mongo-shaped filter DSL — $eq/$ne/$gt/$gte/$lt/$lte, $in/$nin, $exists, $regex, $like, $and/$or/$nor/$not)
find(collection, filter, *, sort, limit, offset) → list[dict] ✅ Done (SQLite leg; sort takes (field, 1 | -1) pairs)
count(collection, filter) → int ✅ Done (SQLite leg)
exists(collection, filter) → bool ✅ Done (SQLite leg; short-circuits via LIMIT 1)
aggregate(collection, pipeline) → list[dict] ✅ Done (SQLite leg; restricted subset: repeatable $match, then at most one $group ($sum/$avg/$min/$max/$count) / $sort / $limit / $count; anything else raises UnsupportedOperationError)
Update, delete, schema, transactions, raw queries ⬜ Not started

Filters are compiled by the shared sql_compiler.py into fully parameterized SQL; column/table names are validated against [A-Za-z_][A-Za-z0-9_]* and quoted. SQLite quotes identifiers with backticks on purpose — double-quoted unknown identifiers silently become string literals in SQLite, hiding typos.

Postgres / Mongo / SQL-MySQL legs raise NotImplementedError until their respective build steps land (see build order §6).

Installation

The PyPI distribution is genius74o-polydb (the plain polydb name is squatted); the Python package you import is still polydb:

pip install genius74o-polydb              # core (no drivers)
pip install "genius74o-polydb[sqlite]"    # + a driver, or: postgres / mongo / mysql
pip install "genius74o-polydb[all]"       # every driver

Quick start (SQLite — the one working leg)

import asyncio

from polydb import Database


async def main() -> None:
    async with Database.from_url("sqlite:///:memory:") as db:
        assert await db.ping() is True

asyncio.run(main())

Connecting to other backends

Database.from_url() resolves all supported schemes to their adapter class, returning an unconnected instance:

URL scheme Adapter class connect() today
postgres:// / postgresql:// PostgresAdapter NotImplementedError (build step 3)
mongodb:// / mongodb+srv:// MongoAdapter NotImplementedError (build step 4)
sqlite:///... SqlAdapter (dialect sqlite) ✅ live
mysql:// SqlAdapter (dialect mysql) NotImplementedError (build step 5)

Under the hood

Development

# install dev extras (pytest, pytest-asyncio, drivers)
pip install -e ".[dev]"

# run the test suite from the repo root
PYTHONPATH=src pytest

Branching & releases

All development happens on the development branch; master is release-only. The publish.yml workflow automates publishing:

Push to Tests Published to Version
development ✅ gate TestPyPI auto <base>.dev<run> (e.g. 0.1.0.dev42) — every commit gets a unique installable version
master ✅ gate PyPI exactly what's in pyproject.toml

To cut a release: bump version in pyproject.toml, merge development into master, and push — PyPI rejects re-uploaded versions, so bump first.

Publishing authenticates with PyPI API tokens stored as GitHub repo secrets (Settings → Secrets and variables → Actions):

Secret Where to create it
TESTPYPI_API_TOKEN test.pypi.org → Account settings → API tokens
PYPI_API_TOKEN pypi.org → Account settings → API tokens

or from the CLI: gh secret set TESTPYPI_API_TOKEN / gh secret set PYPI_API_TOKEN.

Metadata

Release files for genius74o-polydb 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for genius74o-polydb 0.1.0
File Size Uploaded
genius74o_polydb-0.1.0.tar.gz 47.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for genius74o-polydb 0.1.0
File Interpreter ABI Platform
genius74o_polydb-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 78.0 kB

Release files / genius74o_polydb-0.1.0.tar.gz

Download URL genius74o_polydb-0.1.0.tar.gz
Size 47.4 kB
Tags Source
SHA-256 checksum
How to use checksums
8f1369f2a2ac4ff19155e82886e1089886d97aa5700cfa16ba8f34fe948f6dac
BLAKE2b-256 checksum
How to use checksums
aea945f6decbc6f6cd7927f98d4db2b408743865bb7493dc508f5a8baf72d15e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / genius74o_polydb-0.1.0-py3-none-any.whl

Download URL genius74o_polydb-0.1.0-py3-none-any.whl
Size 30.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e3b5fbd72a2ca8f9943d2b4cf966ab1765346bdf066bfe367aa65b9fd51118ce
BLAKE2b-256 checksum
How to use checksums
5b79362d0ed2e7716505d3dc39c79ffdb9fc05063baf1c6b86d37350ba3e8bbc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page