Skip to main content

NextORM

CI PyPI Python License Docs Discord

Modern Python ORM with async support, full type annotations and a generator-expression query DSL.

Features

  • Type-annotated fieldsPK[int], Req[str], Opt[str], Set[T], Single[T]
  • Auto-save sessions — create entities inside db_session and they are committed automatically
  • PonyORM-compatible DSL — generator-expression queries, Entity[pk], Entity.get(), lifecycle hooks
  • Full async supportAsyncDatabase, await db.aselect(...), Entity.aselect(), Entity.aget()
  • Built-in migrations CLInextorm makemigrations / nextorm migrate
  • Three providers — SQLite, PostgreSQL (psycopg3), MariaDB
  • 100% branch coverage enforced in CI

Installation

pip install nextorm[sqlite]        # SQLite (aiosqlite)
pip install nextorm[postgres]      # PostgreSQL (psycopg3)
pip install nextorm[mariadb]       # MariaDB (asyncmy + PyMySQL)
pip install "nextorm[sqlite,postgres,mariadb]"   # all drivers

Quick start

from nextorm import Database, Entity, PK, Req, Opt, Set, Single, db_session


# Define entities — no database coupling required
class Tag(Entity):
    name: Req[str]
    products: Set["Product"]  # many-to-many back-reference


class Product(Entity):
    name: Req[str] = Req(64)  # positional shorthand: max_len=64
    price: Req[float]
    sku: Req[str] = Req(column="product_sku", unique=True)  # marker-call options
    tags: Set[Tag]  # many-to-many
    summary: Opt[str]  # Opt[str]/[LongStr] use empty string for None by default


# Create and connect the database
db = Database(entities=[Tag, Product])  # entities can also be auto-discovered
db.bind("sqlite", ":memory:")
db.generate_mapping(create_tables=True)

# Write — entities are tracked and committed automatically
with db_session:
    t = Tag(name="sale")
    p = Product(name="Widget", price=9.99, sku="WGT-1")
    p.tags.add(t)
# ← INSERT fires here; p.id and t.id are now set

# Read — class-level shortcuts (no explicit db reference needed)
widgets = Product.select().filter(Product.price < 20).fetch_all()
widget = Product.get(name="Widget")  # None if not found
widget = Product[1]  # KeyError if not found

Async quick start

import asyncio
from nextorm import AsyncDatabase, Entity, PK, Req, db_session


class Task(Entity):
    title: Req[str]
    done: Req[bool]


async def main() -> None:
    db = AsyncDatabase(entities=[Task])
    await db.bind("sqlite", ":memory:")
    await db.generate_mapping(create_tables=True)

    async with db_session:
        Task(title="Buy milk", done=False)

    pending = await Task.aselect().filter(Task.done == False).fetch_all()
    task = await Task.aget(title="Buy milk")  # None if not found
    print(pending)


asyncio.run(main())

Migrations

nextorm makemigrations   # generate a migration from model changes
nextorm migrate          # apply pending migrations
nextorm showmigrations   # list migration history

Migrating from PonyORM

NextORM's API is intentionally close to PonyORM's. The main differences:

PonyORM NextORM
class Product(db.Entity) class Product(Entity)
Required(str) Req[str]
Optional(str) Opt[str]
PrimaryKey(int, auto=True) PK[int]
Required(Order) (FK side) Single[Order]
Set("Line") (back-reference) Set["Line"]
select(p for p in Product if ...) identical
Product[42] identical
Product.get(name="x") identical

See the migration guide for details.

Documentation

Full docs at nextorm.readthedocs.io.

Community

Questions, ideas, and feedback are welcome in the NextORM Discord community.

  • 💬 Get help with models, queries, relations, and async usage
  • 🧪 Share bug reports with minimal reproductions
  • 🧭 Discuss roadmap ideas and RFCs
  • 📝 Suggest docs improvements

Join here: https://discord.gg/PevUtddqCM

Development

pdm install
pdm test          # run tests
pdm coverage      # tests + branch coverage (must be 100%)
pdm typecheck     # pyright + mypy
pdm lint          # ruff
pdm format        # ruff format
pdm docs-html     # build Sphinx docs

Acknowledgements

NextORM's API design and query DSL are heavily inspired by PonyORM, created by Alexander Kozlovsky, Alexey Malashkevich and Alexander Tischenko, released under the Apache License 2.0.

NextORM is a new, independent implementation and shares no source code with PonyORM.

Release files for nextorm 0.4.2

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

Source distribution (sdist)

Source distribution for nextorm 0.4.2
File Size Uploaded
nextorm-0.4.2.tar.gz 322.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nextorm 0.4.2
File Interpreter ABI Platform
nextorm-0.4.2-py3-none-any.whl Python 3 none any Details

Total release size: 494.7 kB

Release files / nextorm-0.4.2.tar.gz

Download URL nextorm-0.4.2.tar.gz
Size 322.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9f306594f29bd170592ad604bd56a7335d54aaca30cf69f6b7040195c69ba03d
BLAKE2b-256 checksum
How to use checksums
555b2093aea1ebaf4a4e9df3c2e5538577317f4cc55dd8521d6b2e231a5d240f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via pdm/2.28.2 CPython/3.13.15 Linux/6.17.0-1022-azure

Release files / nextorm-0.4.2-py3-none-any.whl

Download URL nextorm-0.4.2-py3-none-any.whl
Size 172.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b658aefb822b947cf60eb394af452b9da1b24d3017aac07020b767b080500c9e
BLAKE2b-256 checksum
How to use checksums
826f83da9c1805ed3b5f90df83161dab0da4e84becddded286163b6af6114a9a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via pdm/2.28.2 CPython/3.13.15 Linux/6.17.0-1022-azure

Release history Release notifications | RSS feed

0.4.3

2 release files

This release

0.4.2 This release

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

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