# FastAPI ORM
A production-ready ORM library built on SQLAlchemy 2.x with full async support, automatic Pydantic integration, and Django-like syntax designed specifically for FastAPI applications.
## Why FastAPI ORM?
FastAPI ORM combines the power of SQLAlchemy 2.x with the simplicity of Django's ORM, providing:
- ⚡ **Truly Async** - Built from the ground up with asyncio, not a wrapper
- 🎯 **Django-like Syntax** - Clean, intuitive model definitions
- 🔄 **Automatic Pydantic** - Seamless FastAPI response serialization with `.to_response()`
- 💉 **FastAPI Native** - Works perfectly with dependency injection
- 🛡️ **Type-Safe** - Fully typed with excellent IDE support
- 🚀 **Production-Ready** - Multi-tenancy, audit logging, caching, and more
## Quick Start
### Installation
```bash
pip install sqlalchemy>=2.0.0 fastapi>=0.100.0 pydantic>=2.0.0
pip install asyncpg aiosqlite alembic uvicorn
```
### Define Models
```python
from fastapi_orm import Model, IntegerField, StringField, DateTimeField
class User(Model):
__tablename__ = "users"
id: int = IntegerField(primary_key=True)
username: str = StringField(max_length=100, unique=True, nullable=False)
email: str = StringField(max_length=255, unique=True, nullable=False)
is_active: bool = BooleanField(default=True)
created_at = DateTimeField(auto_now_add=True)
```
### Use in FastAPI
```python
from fastapi import FastAPI, Depends
from fastapi_orm import Database
from sqlalchemy.ext.asyncio import AsyncSession
app = FastAPI()
db = Database("sqlite+aiosqlite:///./app.db")
@app.on_event("startup")
async def startup():
await db.create_tables()
async def get_db():
async for session in db.get_session():
yield session
@app.post("/users")
async def create_user(
username: str,
email: str,
session: AsyncSession = Depends(get_db)
):
user = await User.create(session, username=username, email=email)
return user.to_response()
@app.get("/users/{user_id}")
async def get_user(user_id: int, session: AsyncSession = Depends(get_db)):
user = await User.get(session, user_id)
return user.to_response() if user else {"error": "User not found"}
@app.get("/users")
async def list_users(session: AsyncSession = Depends(get_db)):
users = await User.all(session)
return [user.to_response() for user in users]
```
## Core Features
### Complete CRUD Operations
```python
# Create
user = await User.create(session, username="john", email="john@example.com")
# Read
user = await User.get(session, user_id)
all_users = await User.all(session)
active_users = await User.filter(session, is_active=True)
# Update
await user.update_fields(session, email="newemail@example.com")
# Delete
await user.delete(session)
```
### Advanced Filtering
```python
# Operators: gt, gte, lt, lte, contains, startswith, endswith, in
adults = await User.filter_by(session, age={"gte": 18})
johns = await User.filter_by(session, username={"contains": "john"})
admins = await User.filter_by(session, role={"in": ["admin", "moderator"]})
# Ordering
users = await User.filter_by(session, order_by=["-created_at", "username"])
# Pagination
result = await User.paginate(session, page=1, page_size=20)
# Returns: {"items": [...], "total": 100, "page": 1, "pages": 5}
```
### Relationships
```python
from fastapi_orm import ForeignKeyField, OneToMany, ManyToOne
class User(Model):
__tablename__ = "users"
id: int = IntegerField(primary_key=True)
posts = OneToMany("Post", back_populates="author")
class Post(Model):
__tablename__ = "posts"
id: int = IntegerField(primary_key=True)
author_id: int = ForeignKeyField("users")
author = ManyToOne("User", back_populates="posts")
# Use relationships
user = await User.get(session, 1)
for post in user.posts:
print(post.title)
```
### Composite Primary Keys
```python
from fastapi_orm import composite_primary_key, CompositeKeyMixin
class OrderItem(Model, CompositeKeyMixin):
__tablename__ = "order_items"
order_id: int = IntegerField()
product_id: int = IntegerField()
quantity: int = IntegerField()
__table_args__ = (composite_primary_key("order_id", "product_id"),)
@classmethod
def _composite_key_fields(cls):
return ("order_id", "product_id")
# Query by composite key
item = await OrderItem.get_by_composite_key(session, order_id=123, product_id=456)
```
### Bulk Operations
```python
# Bulk create (much faster than individual creates)
users = await User.bulk_create(session, [
{"username": "user1", "email": "user1@example.com"},
{"username": "user2", "email": "user2@example.com"},
{"username": "user3", "email": "user3@example.com"},
])
# Bulk update
await User.bulk_update(session, [
{"id": 1, "is_active": True},
{"id": 2, "is_active": False},
])
# Bulk delete
await User.bulk_delete(session, [1, 2, 3, 4, 5])
```
### Soft Delete
```python
from fastapi_orm import SoftDeleteMixin
class Post(Model, SoftDeleteMixin):
__tablename__ = "posts"
title: str = StringField(max_length=200)
# Soft delete (sets deleted_at timestamp)
await post.soft_delete(session)
# Restore
await post.restore(session)
# Query only active (not deleted)
active_posts = await Post.all(session)
# Query only deleted
deleted_posts = await Post.only_deleted(session)
```
### Transactions
```python
from fastapi_orm import transactional, atomic
# Using decorator
@transactional(session)
async def transfer_funds(from_id, to_id, amount):
from_user = await User.get(session, from_id)
to_user = await User.get(session, to_id)
await from_user.update_fields(session, balance=from_user.balance - amount)
await to_user.update_fields(session, balance=to_user.balance + amount)
# Using context manager
async with atomic(db) as session:
user = await User.create(session, username="john")
post = await Post.create(session, title="First", author_id=user.id)
```
## Advanced Features
### Caching
```python
from fastapi_orm import QueryCache, DistributedCache
# In-memory cache
cache = QueryCache(ttl=300) # 5 minutes
@cache.cached(key="all_users")
async def get_all_users(session):
return await User.all(session)
# Distributed cache (Redis)
dist_cache = DistributedCache("redis://localhost:6379/0")
@dist_cache.cached(key="user_{user_id}")
async def get_user_cached(session, user_id: int):
return await User.get(session, user_id)
```
### Multi-Tenancy
```python
from fastapi_orm import TenantMixin, set_current_tenant
class Document(Model, TenantMixin):
__tablename__ = "documents"
title: str = StringField(max_length=200)
# Set tenant context
set_current_tenant(tenant_id=1)
# All queries automatically filtered by tenant
documents = await Document.all(session) # Only tenant 1's documents
```
### Audit Logging
```python
from fastapi_orm import AuditMixin, set_audit_user, get_audit_trail
class User(Model, AuditMixin):
__tablename__ = "users"
username: str = StringField(max_length=100)
# Set current user
set_audit_user(current_user_id)
# All changes automatically logged
user = await User.create(session, username="john")
await user.update_fields(session, username="john_updated")
# Retrieve audit trail
trail = await get_audit_trail(session, "User", user.id)
```
### Field Validation
```python
from fastapi_orm import EmailValidator, PasswordStrengthValidator
class User(Model):
__tablename__ = "users"
email: str = StringField(
max_length=255,
validators=[EmailValidator()]
)
password: str = StringField(
validators=[PasswordStrengthValidator(min_length=8)]
)
```
### Read Replicas
```python
from fastapi_orm import Database
db = Database(
"postgresql+asyncpg://user:pass@primary/db",
read_replicas=[
"postgresql+asyncpg://user:pass@replica1/db",
"postgresql+asyncpg://user:pass@replica2/db",
]
)
# Reads automatically distributed across replicas
users = await User.all(session) # Uses read replica
# Writes go to primary
user = await User.create(session, username="john") # Uses primary
```
## Feature Highlights
### Database Operations
- ✅ Full async CRUD (create, read, update, delete)
- ✅ Advanced query builder with operators
- ✅ Bulk create, update, delete
- ✅ Soft delete with restore
- ✅ Offset and cursor-based pagination
- ✅ Aggregations (count, sum, avg, max, min)
- ✅ Window functions (ROW_NUMBER, RANK, etc.)
### Database Features
- ✅ Composite primary keys
- ✅ Composite unique constraints
- ✅ Check constraints
- ✅ Advanced indexing (composite, partial, GIN, covering)
- ✅ Full-text search (PostgreSQL)
- ✅ JSON/JSONB operations
- ✅ Database views
### Performance
- ✅ In-memory query caching (TTL support)
- ✅ Distributed caching (Redis)
- ✅ Hybrid L1/L2 caching
- ✅ Read replica support with load balancing
- ✅ Connection pool monitoring
- ✅ Query streaming for large datasets
- ✅ Optimistic locking
### Production Features
- ✅ Multi-tenancy (row-level isolation)
- ✅ Comprehensive audit logging
- ✅ Transaction management (@transactional, atomic())
- ✅ Rate limiting (multiple strategies)
- ✅ WebSocket support for real-time updates
- ✅ Circuit breaker pattern
- ✅ Automatic retry with exponential backoff
### Developer Experience
- ✅ Field validators (email, URL, phone, credit card, etc.)
- ✅ Model factories for testing
- ✅ Database seeding utilities
- ✅ CLI tools (model generation, CRUD scaffolding)
- ✅ GraphQL integration (Strawberry)
- ✅ File upload handling (local, S3)
## Documentation
- **GitHub Repository:** https://github.com/Alqudimi/FastApiOrm
- **API Reference:** https://github.com/Alqudimi/FastApiOrm/tree/main/doc/api
- **Usage Guides:** https://github.com/Alqudimi/FastApiOrm/tree/main/doc/usage-guide
- **Examples:** https://github.com/Alqudimi/FastApiOrm/tree/main/examples
- **Changelog:** See CHANGELOG_*.md files in repository
## Requirements
- Python 3.11 or higher
- SQLAlchemy 2.0 or higher
- FastAPI 0.100 or higher
- Pydantic 2.0 or higher
## Optional Dependencies
Install as needed:
```bash
# Distributed caching
pip install redis>=5.0.0
# WebSocket support
pip install websockets>=12.0
# GraphQL integration
pip install strawberry-graphql>=0.200.0
# File uploads and image processing
pip install aiofiles>=23.0.0 boto3>=1.28.0 pillow>=10.0.0
# All optional features
pip install redis websockets strawberry-graphql aiofiles boto3 pillow
```
## Database Support
- ✅ PostgreSQL (via asyncpg) - Recommended for production
- ✅ SQLite (via aiosqlite) - Great for development
- ✅ MySQL (via aiomysql)
- ✅ Other SQLAlchemy-supported databases
## License
MIT License - see LICENSE file for details
## Author
**Abdulaziz Al-Qadimi**
- Email: eng7mi@gmail.com
- GitHub: [@Alqudimi](https://github.com/Alqudimi)
## Links
- **Repository:** https://github.com/Alqudimi/FastApiOrm
- **Issues:** https://github.com/Alqudimi/FastApiOrm/issues
- **Documentation:** https://github.com/Alqudimi/FastApiOrm/tree/main/doc
## Support
For questions or issues:
- Open an issue on GitHub: https://github.com/Alqudimi/FastApiOrm/issues
- Email: eng7mi@gmail.com
---
**Made with ❤️ by Abdulaziz Al-Qadimi**
Raw data
{
"_id": null,
"home_page": "https://github.com/Alqudimi/FastApiOrm",
"name": "fastapi-orm",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": "fastapi, orm, sqlalchemy, async, pydantic, database, postgresql, mysql, sqlite, rest-api, crud, asyncio, multi-tenancy, audit-logging, caching, websockets",
"author": "Abdulaziz Al-Qadimi",
"author_email": "eng7mi@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/69/2b/8cba4a4cdbb96381ad82e03f702465a39fea7883f899fdf1a422a4b13fb9/fastapi_orm-0.11.0.tar.gz",
"platform": null,
"description": "# FastAPI ORM\n\nA production-ready ORM library built on SQLAlchemy 2.x with full async support, automatic Pydantic integration, and Django-like syntax designed specifically for FastAPI applications.\n\n## Why FastAPI ORM?\n\nFastAPI ORM combines the power of SQLAlchemy 2.x with the simplicity of Django's ORM, providing:\n\n- \u26a1 **Truly Async** - Built from the ground up with asyncio, not a wrapper\n- \ud83c\udfaf **Django-like Syntax** - Clean, intuitive model definitions\n- \ud83d\udd04 **Automatic Pydantic** - Seamless FastAPI response serialization with `.to_response()`\n- \ud83d\udc89 **FastAPI Native** - Works perfectly with dependency injection\n- \ud83d\udee1\ufe0f **Type-Safe** - Fully typed with excellent IDE support\n- \ud83d\ude80 **Production-Ready** - Multi-tenancy, audit logging, caching, and more\n\n## Quick Start\n\n### Installation\n\n```bash\npip install sqlalchemy>=2.0.0 fastapi>=0.100.0 pydantic>=2.0.0\npip install asyncpg aiosqlite alembic uvicorn\n```\n\n### Define Models\n\n```python\nfrom fastapi_orm import Model, IntegerField, StringField, DateTimeField\n\nclass User(Model):\n __tablename__ = \"users\"\n \n id: int = IntegerField(primary_key=True)\n username: str = StringField(max_length=100, unique=True, nullable=False)\n email: str = StringField(max_length=255, unique=True, nullable=False)\n is_active: bool = BooleanField(default=True)\n created_at = DateTimeField(auto_now_add=True)\n```\n\n### Use in FastAPI\n\n```python\nfrom fastapi import FastAPI, Depends\nfrom fastapi_orm import Database\nfrom sqlalchemy.ext.asyncio import AsyncSession\n\napp = FastAPI()\ndb = Database(\"sqlite+aiosqlite:///./app.db\")\n\n@app.on_event(\"startup\")\nasync def startup():\n await db.create_tables()\n\nasync def get_db():\n async for session in db.get_session():\n yield session\n\n@app.post(\"/users\")\nasync def create_user(\n username: str,\n email: str,\n session: AsyncSession = Depends(get_db)\n):\n user = await User.create(session, username=username, email=email)\n return user.to_response()\n\n@app.get(\"/users/{user_id}\")\nasync def get_user(user_id: int, session: AsyncSession = Depends(get_db)):\n user = await User.get(session, user_id)\n return user.to_response() if user else {\"error\": \"User not found\"}\n\n@app.get(\"/users\")\nasync def list_users(session: AsyncSession = Depends(get_db)):\n users = await User.all(session)\n return [user.to_response() for user in users]\n```\n\n## Core Features\n\n### Complete CRUD Operations\n\n```python\n# Create\nuser = await User.create(session, username=\"john\", email=\"john@example.com\")\n\n# Read\nuser = await User.get(session, user_id)\nall_users = await User.all(session)\nactive_users = await User.filter(session, is_active=True)\n\n# Update\nawait user.update_fields(session, email=\"newemail@example.com\")\n\n# Delete\nawait user.delete(session)\n```\n\n### Advanced Filtering\n\n```python\n# Operators: gt, gte, lt, lte, contains, startswith, endswith, in\nadults = await User.filter_by(session, age={\"gte\": 18})\njohns = await User.filter_by(session, username={\"contains\": \"john\"})\nadmins = await User.filter_by(session, role={\"in\": [\"admin\", \"moderator\"]})\n\n# Ordering\nusers = await User.filter_by(session, order_by=[\"-created_at\", \"username\"])\n\n# Pagination\nresult = await User.paginate(session, page=1, page_size=20)\n# Returns: {\"items\": [...], \"total\": 100, \"page\": 1, \"pages\": 5}\n```\n\n### Relationships\n\n```python\nfrom fastapi_orm import ForeignKeyField, OneToMany, ManyToOne\n\nclass User(Model):\n __tablename__ = \"users\"\n id: int = IntegerField(primary_key=True)\n posts = OneToMany(\"Post\", back_populates=\"author\")\n\nclass Post(Model):\n __tablename__ = \"posts\"\n id: int = IntegerField(primary_key=True)\n author_id: int = ForeignKeyField(\"users\")\n author = ManyToOne(\"User\", back_populates=\"posts\")\n\n# Use relationships\nuser = await User.get(session, 1)\nfor post in user.posts:\n print(post.title)\n```\n\n### Composite Primary Keys\n\n```python\nfrom fastapi_orm import composite_primary_key, CompositeKeyMixin\n\nclass OrderItem(Model, CompositeKeyMixin):\n __tablename__ = \"order_items\"\n \n order_id: int = IntegerField()\n product_id: int = IntegerField()\n quantity: int = IntegerField()\n \n __table_args__ = (composite_primary_key(\"order_id\", \"product_id\"),)\n \n @classmethod\n def _composite_key_fields(cls):\n return (\"order_id\", \"product_id\")\n\n# Query by composite key\nitem = await OrderItem.get_by_composite_key(session, order_id=123, product_id=456)\n```\n\n### Bulk Operations\n\n```python\n# Bulk create (much faster than individual creates)\nusers = await User.bulk_create(session, [\n {\"username\": \"user1\", \"email\": \"user1@example.com\"},\n {\"username\": \"user2\", \"email\": \"user2@example.com\"},\n {\"username\": \"user3\", \"email\": \"user3@example.com\"},\n])\n\n# Bulk update\nawait User.bulk_update(session, [\n {\"id\": 1, \"is_active\": True},\n {\"id\": 2, \"is_active\": False},\n])\n\n# Bulk delete\nawait User.bulk_delete(session, [1, 2, 3, 4, 5])\n```\n\n### Soft Delete\n\n```python\nfrom fastapi_orm import SoftDeleteMixin\n\nclass Post(Model, SoftDeleteMixin):\n __tablename__ = \"posts\"\n title: str = StringField(max_length=200)\n\n# Soft delete (sets deleted_at timestamp)\nawait post.soft_delete(session)\n\n# Restore\nawait post.restore(session)\n\n# Query only active (not deleted)\nactive_posts = await Post.all(session)\n\n# Query only deleted\ndeleted_posts = await Post.only_deleted(session)\n```\n\n### Transactions\n\n```python\nfrom fastapi_orm import transactional, atomic\n\n# Using decorator\n@transactional(session)\nasync def transfer_funds(from_id, to_id, amount):\n from_user = await User.get(session, from_id)\n to_user = await User.get(session, to_id)\n \n await from_user.update_fields(session, balance=from_user.balance - amount)\n await to_user.update_fields(session, balance=to_user.balance + amount)\n\n# Using context manager\nasync with atomic(db) as session:\n user = await User.create(session, username=\"john\")\n post = await Post.create(session, title=\"First\", author_id=user.id)\n```\n\n## Advanced Features\n\n### Caching\n\n```python\nfrom fastapi_orm import QueryCache, DistributedCache\n\n# In-memory cache\ncache = QueryCache(ttl=300) # 5 minutes\n\n@cache.cached(key=\"all_users\")\nasync def get_all_users(session):\n return await User.all(session)\n\n# Distributed cache (Redis)\ndist_cache = DistributedCache(\"redis://localhost:6379/0\")\n\n@dist_cache.cached(key=\"user_{user_id}\")\nasync def get_user_cached(session, user_id: int):\n return await User.get(session, user_id)\n```\n\n### Multi-Tenancy\n\n```python\nfrom fastapi_orm import TenantMixin, set_current_tenant\n\nclass Document(Model, TenantMixin):\n __tablename__ = \"documents\"\n title: str = StringField(max_length=200)\n\n# Set tenant context\nset_current_tenant(tenant_id=1)\n\n# All queries automatically filtered by tenant\ndocuments = await Document.all(session) # Only tenant 1's documents\n```\n\n### Audit Logging\n\n```python\nfrom fastapi_orm import AuditMixin, set_audit_user, get_audit_trail\n\nclass User(Model, AuditMixin):\n __tablename__ = \"users\"\n username: str = StringField(max_length=100)\n\n# Set current user\nset_audit_user(current_user_id)\n\n# All changes automatically logged\nuser = await User.create(session, username=\"john\")\nawait user.update_fields(session, username=\"john_updated\")\n\n# Retrieve audit trail\ntrail = await get_audit_trail(session, \"User\", user.id)\n```\n\n### Field Validation\n\n```python\nfrom fastapi_orm import EmailValidator, PasswordStrengthValidator\n\nclass User(Model):\n __tablename__ = \"users\"\n \n email: str = StringField(\n max_length=255,\n validators=[EmailValidator()]\n )\n password: str = StringField(\n validators=[PasswordStrengthValidator(min_length=8)]\n )\n```\n\n### Read Replicas\n\n```python\nfrom fastapi_orm import Database\n\ndb = Database(\n \"postgresql+asyncpg://user:pass@primary/db\",\n read_replicas=[\n \"postgresql+asyncpg://user:pass@replica1/db\",\n \"postgresql+asyncpg://user:pass@replica2/db\",\n ]\n)\n\n# Reads automatically distributed across replicas\nusers = await User.all(session) # Uses read replica\n\n# Writes go to primary\nuser = await User.create(session, username=\"john\") # Uses primary\n```\n\n## Feature Highlights\n\n### Database Operations\n- \u2705 Full async CRUD (create, read, update, delete)\n- \u2705 Advanced query builder with operators\n- \u2705 Bulk create, update, delete\n- \u2705 Soft delete with restore\n- \u2705 Offset and cursor-based pagination\n- \u2705 Aggregations (count, sum, avg, max, min)\n- \u2705 Window functions (ROW_NUMBER, RANK, etc.)\n\n### Database Features\n- \u2705 Composite primary keys\n- \u2705 Composite unique constraints\n- \u2705 Check constraints\n- \u2705 Advanced indexing (composite, partial, GIN, covering)\n- \u2705 Full-text search (PostgreSQL)\n- \u2705 JSON/JSONB operations\n- \u2705 Database views\n\n### Performance\n- \u2705 In-memory query caching (TTL support)\n- \u2705 Distributed caching (Redis)\n- \u2705 Hybrid L1/L2 caching\n- \u2705 Read replica support with load balancing\n- \u2705 Connection pool monitoring\n- \u2705 Query streaming for large datasets\n- \u2705 Optimistic locking\n\n### Production Features\n- \u2705 Multi-tenancy (row-level isolation)\n- \u2705 Comprehensive audit logging\n- \u2705 Transaction management (@transactional, atomic())\n- \u2705 Rate limiting (multiple strategies)\n- \u2705 WebSocket support for real-time updates\n- \u2705 Circuit breaker pattern\n- \u2705 Automatic retry with exponential backoff\n\n### Developer Experience\n- \u2705 Field validators (email, URL, phone, credit card, etc.)\n- \u2705 Model factories for testing\n- \u2705 Database seeding utilities\n- \u2705 CLI tools (model generation, CRUD scaffolding)\n- \u2705 GraphQL integration (Strawberry)\n- \u2705 File upload handling (local, S3)\n\n## Documentation\n\n- **GitHub Repository:** https://github.com/Alqudimi/FastApiOrm\n- **API Reference:** https://github.com/Alqudimi/FastApiOrm/tree/main/doc/api\n- **Usage Guides:** https://github.com/Alqudimi/FastApiOrm/tree/main/doc/usage-guide\n- **Examples:** https://github.com/Alqudimi/FastApiOrm/tree/main/examples\n- **Changelog:** See CHANGELOG_*.md files in repository\n\n## Requirements\n\n- Python 3.11 or higher\n- SQLAlchemy 2.0 or higher\n- FastAPI 0.100 or higher\n- Pydantic 2.0 or higher\n\n## Optional Dependencies\n\nInstall as needed:\n\n```bash\n# Distributed caching\npip install redis>=5.0.0\n\n# WebSocket support\npip install websockets>=12.0\n\n# GraphQL integration\npip install strawberry-graphql>=0.200.0\n\n# File uploads and image processing\npip install aiofiles>=23.0.0 boto3>=1.28.0 pillow>=10.0.0\n\n# All optional features\npip install redis websockets strawberry-graphql aiofiles boto3 pillow\n```\n\n## Database Support\n\n- \u2705 PostgreSQL (via asyncpg) - Recommended for production\n- \u2705 SQLite (via aiosqlite) - Great for development\n- \u2705 MySQL (via aiomysql)\n- \u2705 Other SQLAlchemy-supported databases\n\n## License\n\nMIT License - see LICENSE file for details\n\n## Author\n\n**Abdulaziz Al-Qadimi**\n- Email: eng7mi@gmail.com\n- GitHub: [@Alqudimi](https://github.com/Alqudimi)\n\n## Links\n\n- **Repository:** https://github.com/Alqudimi/FastApiOrm\n- **Issues:** https://github.com/Alqudimi/FastApiOrm/issues\n- **Documentation:** https://github.com/Alqudimi/FastApiOrm/tree/main/doc\n\n## Support\n\nFor questions or issues:\n- Open an issue on GitHub: https://github.com/Alqudimi/FastApiOrm/issues\n- Email: eng7mi@gmail.com\n\n---\n\n**Made with \u2764\ufe0f by Abdulaziz Al-Qadimi**\n",
"bugtrack_url": null,
"license": null,
"summary": "A production-ready ORM for FastAPI with async support, automatic Pydantic integration, and Django-like syntax",
"version": "0.11.0",
"project_urls": {
"Bug Tracker": "https://github.com/Alqudimi/FastApiOrm/issues",
"Changelog": "https://github.com/Alqudimi/FastApiOrm/blob/main/CHANGELOG_V0.11.md",
"Documentation": "https://github.com/Alqudimi/FastApiOrm/tree/main/doc",
"Homepage": "https://github.com/Alqudimi/FastApiOrm",
"Source Code": "https://github.com/Alqudimi/FastApiOrm"
},
"split_keywords": [
"fastapi",
" orm",
" sqlalchemy",
" async",
" pydantic",
" database",
" postgresql",
" mysql",
" sqlite",
" rest-api",
" crud",
" asyncio",
" multi-tenancy",
" audit-logging",
" caching",
" websockets"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "d51150337ef93d48909cf791a31769eae25e365fea2f5488e0f4942d93700e13",
"md5": "debb34193452ee6795f8afc4fdd737dc",
"sha256": "7d650c9be10fa6a4264f613622b2cfb2ead78030df0908102f87347253792931"
},
"downloads": -1,
"filename": "fastapi_orm-0.11.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "debb34193452ee6795f8afc4fdd737dc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 143520,
"upload_time": "2025-10-24T00:26:03",
"upload_time_iso_8601": "2025-10-24T00:26:03.640238Z",
"url": "https://files.pythonhosted.org/packages/d5/11/50337ef93d48909cf791a31769eae25e365fea2f5488e0f4942d93700e13/fastapi_orm-0.11.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "692b8cba4a4cdbb96381ad82e03f702465a39fea7883f899fdf1a422a4b13fb9",
"md5": "8571caa9722345435c950d0496933c07",
"sha256": "a8c30c3a8547ead915d6b1455a479eac4a8185c1d0eaaa9dd73baa6edcf4797c"
},
"downloads": -1,
"filename": "fastapi_orm-0.11.0.tar.gz",
"has_sig": false,
"md5_digest": "8571caa9722345435c950d0496933c07",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 181880,
"upload_time": "2025-10-24T00:26:06",
"upload_time_iso_8601": "2025-10-24T00:26:06.634515Z",
"url": "https://files.pythonhosted.org/packages/69/2b/8cba4a4cdbb96381ad82e03f702465a39fea7883f899fdf1a422a4b13fb9/fastapi_orm-0.11.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-24 00:26:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Alqudimi",
"github_project": "FastApiOrm",
"github_not_found": true,
"lcname": "fastapi-orm"
}