A lightweight ORM built on Pydantic for simple CRUD operations with minimal code
Project description
Ormantism
A tiny, simple ORM built on top of Pydantic.
When you need to perform simple CRUD operations with minimal code.
Offers support for PostgreSQL, MySQL, SQLite (database URL syntax is the same as in SQLAlchemy).
Features
- Simple Model Declaration: Define your models using familiar Pydantic syntax
- Automatic Table Creation: Tables are created automatically when first accessed
- Lazy Loading: Relationships are loaded on-demand for optimal performance
- Transaction Support: Built-in transaction management with automatic rollback
- Preloading: Efficiently load related data with JOIN queries
- Optional Timestamps: Add created_at, updated_at, deleted_at fields automatically
Installation
pip install ormantism
Quick Start
1. Connect to Database
import ormantism
# Connect to a file database
ormantism.connect("sqlite:///my_app.db")
# Or use in-memory database for testing
ormantism.connect("sqlite://:memory:")
# MySQL
ormantism.connect("mysql://login:password@host:port/database")
# PostgresSQL
ormantism.connect("postgresql://login:password@host:port/database")
2. Define Models
from ormantism import Base
from typing import Optional
class User(Base):
name: str
email: str
age: Optional[int] = None
class Post(Base, with_timestamps=True):
title: str
content: str
author: User
3. Create and Save Records
# Create a user
user = User(name="Alice", email="alice@example.com", age=30)
# The record is automatically saved to the database
# Create a post linked to the user
post = Post(title="My First Post", content="Hello World!", author=user)
4. Query Records
# Load by ID
user = User.load(id=1)
# Load by criteria
user = User.load(name="Alice")
user = User.load(email="alice@example.com")
# Load latest post from alice@example.com
latest_post = Post.load(user_id=user.id, last_created=True)
# Load all records
users = User.load_all()
# Load with criteria
users_named_alice = User.load_all(name="Alice")
5. Update Records
user = User.load(id=1)
user.age = 31 # Automatically saved to database
# or
user.update(age=31, email="alice.updated@example.com")
6. Delete Records
user = User.load(id=1)
user.delete()
Advanced Features
Timestamps
Add automatic timestamp tracking to your models:
class Post(Base, with_timestamps=True):
title: str
content: str
This adds created_at, updated_at, and deleted_at fields. Soft deletes are used when timestamps are enabled.
Relationships and Lazy Loading
class Author(Base):
name: str
class Book(Base):
title: str
author: Author
# Create records
author = Author(name="Jane Doe")
book = Book(title="My Book", author=author)
# Lazy loading - author is loaded from DB when accessed
book = Book.load(id=1)
print(book.author.name) # Database query happens here
Preloading (Eager Loading)
Avoid N+1 queries by preloading relationships:
# Load book with author in a single query
book = Book.load(id=1, preload="author")
print(book.author.name) # No additional database query
# Preload nested relationships
book = Book.load(id=1, preload="author.publisher")
# Preload multiple relationships
book = Book.load(id=1, preload=["author", "category"])
Transactions
from ormantism import transaction
try:
with transaction() as t:
user1 = User(name="Alice", email="alice@example.com")
user2 = User(name="Bob", email="bob@example.com")
# Both users are saved automatically
# Transaction commits when exiting the context
except Exception:
# Transaction is automatically rolled back on any exception
pass
Querying Examples
# Load single record
user = User.load(name="Alice")
latest_user = User.load(last_created=True)
# Load multiple records
all_users = User.load_all()
users_named_alice = User.load_all(name="Alice")
# Include soft-deleted records (when using timestamps)
all_including_deleted = User.load_all(with_deleted=True)
Model Definition
Basic Model
class User(Base):
name: str
email: str
age: int = 25 # Default value
bio: Optional[str] = None # Nullable field
With Timestamps
class Post(Base, with_timestamps=True):
title: str
content: str
# Automatically adds: created_at, updated_at, deleted_at
Supported Field Types
int,float,strOptional[T]for nullable fieldslist,dict(stored as JSON)datetime.datetimeenum.Enum- Pydantic models (stored as JSON)
- References to other Base models
Relationships
class Category(Base):
name: str
class Post(Base):
title: str
category: Category # Foreign key relationship
tags: Optional[Category] = None # Nullable relationship
API Reference
Base Class Methods
Creating Records
Model()- Create and automatically save a new record
Querying
Model.load(**criteria)- Load single recordModel.load(last_created=True)- Load most recently created recordModel.load_all(**criteria)- Load multiple recordsModel.load(preload="relationship")- Eager load relationshipsModel.load(with_deleted=True)- Include soft-deleted records
Updating
instance.update(**kwargs)- Update multiple fieldsinstance.field = value- Update single field (auto-saves)
Deleting
instance.delete()- Delete record (soft delete if timestamps enabled)
Database Functions
ormantism.connect(database_url)- Connect to databaseormantism.transaction()- Get transaction context manager
Limitations
- Simple Queries: Complex queries may require raw SQL
- No Migrations: Schema changes require manual handling
- Basic Relationships: Only supports simple foreign key relationships
Requirements
- Python 3.12+
- Pydantic
License
MIT License
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
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 ormantism-0.5.7.tar.gz.
File metadata
- Download URL: ormantism-0.5.7.tar.gz
- Upload date:
- Size: 27.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23b7f6b00f0e33f352c070ce6db576119947d16cb1d963749b94df6b9f56beea
|
|
| MD5 |
5e1983f40522f49ed5ae44bf945a023b
|
|
| BLAKE2b-256 |
c9fadbab78c76f26d6763a1fd6352a8da06a45b136e59d0bbedba598364da610
|
File details
Details for the file ormantism-0.5.7-py3-none-any.whl.
File metadata
- Download URL: ormantism-0.5.7-py3-none-any.whl
- Upload date:
- Size: 25.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfc65a69fc5f832798fe4a48b97e62d6a6cc6fdc82a6b8493fc499ba6d0872ce
|
|
| MD5 |
7b9acad5f8fad80a8f76be558b53d892
|
|
| BLAKE2b-256 |
106764b16f056b8ff356029260aeb5240368de39252cc0c734f96e31e4eb7b21
|