Skip to main content

Next-generation async ORM for Python with a Rust-powered core

Project description

Ferrum

A next-generation async ORM for Python. Rust-powered engine. Pydantic-native models. Django-inspired developer experience.

Ferrum is an async-first ORM designed for modern Python applications.

Built around a Rust-powered core and a Python-native API, Ferrum combines the ergonomics of Django's ORM, the type safety of Pydantic, and the performance of Rust.

Why Ferrum?

Existing Python ORMs often force developers to choose between:

  • Developer experience
  • Async support
  • Type safety
  • Performance

Ferrum aims to provide all four.

Goals

  • Native async from day one
  • Pydantic-first models
  • Django-inspired ORM experience
  • Rust-powered query engine
  • PostgreSQL-first architecture (MySQL, SQLite, and SQL Server via optional extras)
  • Type-safe query construction
  • Automatic migrations
  • High-performance result hydration
  • Production-ready observability

Quick Example

from ferrum import Model


class User(Model):
    id: int
    email: str
    is_active: bool = True


user = await User.objects.create(
    conn,
    email="john@example.com",
)

users = await (
    User.objects
    .filter(is_active=True)
    .order_by("-id")
    .limit(10)
    .all(conn)
)

async with conn.transaction() as tx:
    user = await User.objects.create(tx, email="jane@example.com")
    await AuditLog.objects.create(tx, user_id=user.id, action="signup")

Features

Async First

No synchronous compatibility layer.

Ferrum is designed around modern async Python applications.

users = await User.objects.all(conn)

Pydantic Native

Models are built directly on top of Pydantic.

class User(Model):
    id: int
    email: str

No duplicate schema definitions.

Django-Inspired API

Familiar query interface.

users = await (
    User.objects
    .filter(email__contains="@gmail.com")
    .order_by("-created_at")
    .all(conn)
)

Rust-Powered Core

Performance-critical components are implemented in Rust:

  • Query compilation
  • SQL generation
  • Result decoding
  • Schema analysis
  • Migration planning

This allows Ferrum to maintain a Pythonic API without sacrificing performance.

Cross-Driver Full-Text Search

Native full-text search across PostgreSQL, MySQL, SQLite FTS5, and SQL Server — one QuerySet API, dialect-specific SQL emit and migration DDL.

Query modes (filter lookups and ranking):

Mode Lookup operator Typical use
plain __match Natural-language terms
phrase __match_phrase Exact phrase
websearch __match_websearch Web-style quotes, - negation
boolean __match_boolean Boolean operators (&, |, !)

Convenience methods:

# Filter + relevance ranking in one call
hits = await Article.objects.search(
    "python async orm", field="body", mode="websearch"
).limit(10).all(conn)

# Rank without an implicit filter
ranked = await Article.objects.rank_by("body", "rust", mode="plain").all(conn)

Index declaration — PostgreSQL uses TSVector columns; other drivers index base text columns via Meta.full_text_indexes:

from ferrum.models import Field, FullTextIndex

class Article(Model):
    search_vector: Annotated[TSVector, Field(fts_config="english")] | None = None
    body: str = ""

    class Meta:
        full_text_indexes = [FullTextIndex(fields=("body",), config="english")]

Query strings are always bound parameters; fts_config and index names come from model-metadata allowlists only. See Getting Started → Vector and full-text columns and API Reference for per-dialect DDL and operator mapping.

Architecture

┌──────────────────────────┐
│      Python API          │
│  Models / QuerySets      │
└────────────┬─────────────┘
             │
             ▼
┌──────────────────────────┐
│      Ferrum Core         │
│      (Rust Engine)       │
├──────────────────────────┤
│ Query Compiler           │
│ SQL AST                  │
│ Result Decoder           │
│ Migration Planner        │
└────────────┬─────────────┘
             │
             ▼
┌──────────────────────────┐
│       PostgreSQL         │
└──────────────────────────┘

Roadmap

v0.1 (complete)

  • PostgreSQL support
  • Basic CRUD operations
  • Async query execution
  • Pydantic models
  • Query builder
  • Type-safe filters
  • Transactions and savepoints
  • Bulk operations (bulk_create, bulk_update, bulk_delete)
  • Migrations (schema diff, apply, revert, CLI)
  • Relationships (ForeignKey, OneToOne, ManyToMany)
  • pgvector KNN search and HNSW/IVFFLAT index DDL
  • Full-text search (cross-dialect: PostgreSQL, MySQL, SQLite FTS5, SQL Server)
  • Observability hooks (Tier A/B/C)
  • CLI (makemigrations, migrate, revert, showmigrations, inspectdb, resetdb)

v0.2 (in progress)

  • Upsert API (upsert, bulk_upsert with conflict targets and RETURNING)
  • Composite primary keys
  • Array field types (uuid[], text[], scalar arrays)
  • JSONB operators (__contains, __has_key)
  • RLS / tenant session helpers (set_config, tenant_session)
  • call_function for allowlisted stored-procedure calls
  • Migration ops for extensions, RLS policies, and function DDL
  • pgvector similarity score projection (vector_search helper)
  • Query optimization (deferred fields, prefetch tuning)
  • Advanced relationship loading

v1.0

  • Production-ready stability
  • Performance benchmarking suite
  • Full documentation site

Project Status

Ferrum is currently in active development.

The API is not yet stable and breaking changes should be expected until the first public release.

Installation

# PostgreSQL (most common)
pip install 'ferrum-orm[pg]'

# PostgreSQL + migrations CLI
pip install 'ferrum-orm[pg,cli]'

# MySQL
pip install 'ferrum-orm[mysql]'

# SQLite + migrations CLI (testing / local dev)
pip install 'ferrum-orm[sqlite,cli]'

# SQL Server (also needs a system ODBC driver, e.g. msodbcsql18)
pip install 'ferrum-orm[mssql]'

# Optional MessagePack wire format for the Python<->Rust boundary
pip install 'ferrum-orm[msgpack]'

# Everything (all drivers + CLI + dotenv)
pip install 'ferrum-orm[all]'

# Core ORM only (no database driver — install a driver extra before connecting)
pip install ferrum-orm

Bare ferrum-orm installs Pydantic and the Rust core only. Choose a driver extra (pg, mysql, sqlite, or mssql) before calling ferrum.connect().

MySQL, SQLite, and SQL Server are thin-parity backends: they support core CRUD and migrations but not transactions, upsert, bulk_update, RLS, or pgvector (PostgreSQL only). SQL Server connects via aioodbc/pyodbc and requires a system ODBC driver such as msodbcsql18; DSNs use the mssql:// or sqlserver:// scheme.

Wire format (advanced)

The Python↔Rust IR/hydration boundary defaults to JSON. Installing the msgpack extra lets you switch it to MessagePack, selected via the FERRUM_WIRE_FORMAT environment variable (json | msgpack) or the [ferrum] wire_format key in ferrum.toml / pyproject.toml. JSON remains the default; MessagePack is opt-in.

From source, build the native extension with maturin develop (or mise run dev).

Examples

Runnable samples live under examples/:

Contributing

Contributions are welcome. Start with CONTRIBUTING.md for local setup, scoped verification, architecture rules, and pull request expectations.

License

Apache License 2.0

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

ferrum_orm-0.1.5.tar.gz (165.4 kB view details)

Uploaded Source

Built Distributions

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

ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_x86_64.whl (816.1 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ x86-64

ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_aarch64.whl (797.2 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ ARM64

ferrum_orm-0.1.5-cp311-abi3-macosx_11_0_arm64.whl (747.0 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

ferrum_orm-0.1.5-cp311-abi3-macosx_10_12_x86_64.whl (781.6 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

Details for the file ferrum_orm-0.1.5.tar.gz.

File metadata

  • Download URL: ferrum_orm-0.1.5.tar.gz
  • Upload date:
  • Size: 165.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ferrum_orm-0.1.5.tar.gz
Algorithm Hash digest
SHA256 e78ce96b9ebada6973c472e4ef3a6a22b603f2375de3fd6560a3ce517130ea9a
MD5 fb39ca26b721c4706296f565acff5cd8
BLAKE2b-256 d51a67ace29bdcd15115fcc70906e35b16bee97ebde363a20ec2661afdf4e568

See more details on using hashes here.

Provenance

The following attestation bundles were made for ferrum_orm-0.1.5.tar.gz:

Publisher: release.yml on ferrum-orm/ferrum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a5e678b69482f84d870db815300e123f7c717edd84bee00302824fdbe0d627a4
MD5 51c7cc0c692bd675d2fb3c3db2e075db
BLAKE2b-256 3fb457aa18c6895ea87b4d64737cfdaf5575d219c4b39b149b0089dd72e60f1f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on ferrum-orm/ferrum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3710e869172e4000cc5cca2647c67bce313d805dfc7c1b4076e267baeba092c8
MD5 80f0b46d75d2a64250bd389325365880
BLAKE2b-256 0891e8cda4335d6e93e2554272207830004aadb229203cf019564a6ecaa7e486

See more details on using hashes here.

Provenance

The following attestation bundles were made for ferrum_orm-0.1.5-cp311-abi3-manylinux_2_28_aarch64.whl:

Publisher: release.yml on ferrum-orm/ferrum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ferrum_orm-0.1.5-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ferrum_orm-0.1.5-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1d6a784ffcd2ed9bb8f465a9cde71d83b0a9b928f1e06510c6bdc5cfa007ae32
MD5 60de1a707b83643faa5c9be4016d2418
BLAKE2b-256 f252b845cfd5e43eb9a4dd1e066b54639315e08cdb895e687a75998d6ed1560c

See more details on using hashes here.

Provenance

The following attestation bundles were made for ferrum_orm-0.1.5-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on ferrum-orm/ferrum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ferrum_orm-0.1.5-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ferrum_orm-0.1.5-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c45a2afc545f1b09218b1db045ac26c0db93c757e8515176bf47b25dcfc871b0
MD5 4e9cbcfb0fe56cffe72586dc5db0260d
BLAKE2b-256 1c726e6cf7849c3b5acd90d0cd0aec17e6cc339964d943ea52fec621b7e86aad

See more details on using hashes here.

Provenance

The following attestation bundles were made for ferrum_orm-0.1.5-cp311-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on ferrum-orm/ferrum

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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