fastapi-orm


Namefastapi-orm JSON
Version 0.11.0 PyPI version JSON
download
home_pagehttps://github.com/Alqudimi/FastApiOrm
SummaryA production-ready ORM for FastAPI with async support, automatic Pydantic integration, and Django-like syntax
upload_time2025-10-24 00:26:06
maintainerNone
docs_urlNone
authorAbdulaziz Al-Qadimi
requires_python>=3.11
licenseNone
keywords fastapi orm sqlalchemy async pydantic database postgresql mysql sqlite rest-api crud asyncio multi-tenancy audit-logging caching websockets
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 1.26344s