High-performance async Python ORM with Rust core
Project description
Oxyde ORM is a type-safe, Pydantic-centric asynchronous ORM with a high-performance Rust core designed for clarity, speed, and reliability.
Inspired by the elegance of Django's ORM, Oxyde focuses on explicitness over magic, providing a modern developer-friendly workflow with predictable behavior and strong typing throughout.
Heads up! Oxyde is a young project under active development. The API may evolve between minor versions. Feedback, bug reports, and ideas are very welcome. Feel free to open an issue!
Features
- Django-style API — Familiar
Model.objects.filter()syntax - Pydantic v2 models — Full validation, type hints, serialization
- Async-first — Built for modern async Python with
asyncio - Rust performance — SQL generation and execution in native Rust
- Multi-database — PostgreSQL, SQLite, MySQL support
- Transactions —
transaction.atomic()context manager with savepoints - Migrations — Django-style
makemigrationsandmigrateCLI
Performance
Benchmarks vs popular Python ORMs (avg ops/sec, higher is better):
| Database | Oxyde | Tortoise | Piccolo | Django | SQLAlchemy | SQLModel | Peewee |
|---|---|---|---|---|---|---|---|
| PostgreSQL | 1,475 | 888 | 932 | 736 | 445 | 431 | 80 |
| MySQL | 1,239 | 794 | — | 714 | 536 | 505 | 461 |
| SQLite | 2,525 | 1,882 | 469 | 1,294 | 588 | 567 | 548 |
Full benchmark report: Documentation
Installation
pip install oxyde
Quick Start
1. Initialize Project
oxyde init
This creates oxyde_config.py with your database settings and model paths.
2. Define Models
# models.py
from oxyde import Model, Field
class User(Model):
id: int | None = Field(default=None, db_pk=True)
name: str
email: str = Field(db_unique=True)
age: int | None = Field(default=None)
class Meta:
is_table = True
3. Create Tables
oxyde makemigrations
oxyde migrate
4. Use It
import asyncio
from oxyde import db
from models import User
async def main():
await db.init(default="sqlite:///app.db")
# Create
user = await User.objects.create(name="Alice", email="alice@example.com", age=30)
# Read
users = await User.objects.filter(age__gte=18).all()
user = await User.objects.get(id=1)
# Update
user.age = 31
await user.save()
# Delete
await user.delete()
await db.close()
asyncio.run(main())
Transactions
from oxyde.db import transaction
async with transaction.atomic():
user = await User.objects.create(name="Alice", email="alice@example.com")
await Profile.objects.create(user_id=user.id)
# Auto-commits on success, rolls back on exception
FastAPI Integration
from fastapi import FastAPI
from oxyde import db
app = FastAPI(
lifespan=db.lifespan(
default="postgresql://localhost/mydb",
)
)
@app.get("/users")
async def get_users():
return await User.objects.filter(is_active=True).all()
Database Support
| Database | Min Version | Status | Notes |
|---|---|---|---|
| PostgreSQL | 12+ | Full | RETURNING, UPSERT, FOR UPDATE/SHARE, JSON, Arrays |
| SQLite | 3.35+ | Full | RETURNING, UPSERT, WAL mode by default |
| MySQL | 8.0+ | Full | UPSERT via ON DUPLICATE KEY, FOR UPDATE/SHARE |
Connection URLs:
postgresql://user:password@localhost:5432/database
sqlite:///path/to/database.db
sqlite:///:memory:
mysql://user:password@localhost:3306/database
Ecosystem
Oxyde Admin
Auto-generated admin panel for Oxyde ORM with zero boilerplate.
- Automatic CRUD, search, filters, export
- FastAPI, Litestar, Sanic, Quart, Falcon
- Theming, authentication, bulk operations
pip install oxyde-admin
Documentation
Full documentation: https://oxyde.fatalyst.dev/
- Quick Start — Get up and running
- User Guide — Models, queries, relations, transactions
- Cheatsheet — Quick reference for all methods
Contributing
If you have suggestions or find a bug, please open an issue or create a pull request on GitHub.
License
This project is licensed under the terms of the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file oxyde-0.7.1.tar.gz.
File metadata
- Download URL: oxyde-0.7.1.tar.gz
- Upload date:
- Size: 104.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c18ff6636388a615eb21a36845ceb32100493164d1842b306b51694e550bb4b
|
|
| MD5 |
a63c38822ba3a0c9f16844d1a8d31cdc
|
|
| BLAKE2b-256 |
743a1ddf63843fefa796518524b5b8779738fa18a48d9f11f7fd49b3ac6b8957
|
File details
Details for the file oxyde-0.7.1-py3-none-any.whl.
File metadata
- Download URL: oxyde-0.7.1-py3-none-any.whl
- Upload date:
- Size: 127.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c6e55eea5f3ec31c115da77770875b5b6c0daedbaffa602202373ba05127b9b
|
|
| MD5 |
1016d161031b8aeaf748aa2aeff2b6f4
|
|
| BLAKE2b-256 |
0b11a9b74b100515f4a48b4aca10e54032dbd7ade065a545aadfc6f788e00fa8
|