FastAPI-AutoCRUD


NameFastAPI-AutoCRUD JSON
Version 0.1.3 PyPI version JSON
download
home_pageNone
SummaryA powerful, enterprise-level FastAPI CRUD router factory that automatically generates REST endpoints with advanced features like filtering, pagination, searching, sorting, bulk operations, and custom endpoint decorators.
upload_time2025-07-28 13:49:11
maintainerNone
docs_urlNone
authorNone
requires_python>=3.12
licenseMIT
keywords api crud fastapi pydantic rest router sqlalchemy
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # FastAPI-AutoCRUD

A powerful, enterprise-level FastAPI CRUD router factory for SQLAlchemy models. It automatically generates REST endpoints with advanced features: filtering, pagination, searching, sorting, bulk operations, custom endpoint decorators, and lifecycle hooks.

---

## Table of Contents
- [Overview](#overview)
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Core Concepts & Features](#core-concepts--features)
- [Endpoint Reference](#endpoint-reference)
- [Advanced Usage](#advanced-usage)
- [Best Practices](#best-practices)
- [Troubleshooting](#troubleshooting)

---

## Overview

**FastAPI-AutoCRUD** eliminates boilerplate for CRUD APIs. It:
- Generates all CRUD endpoints for your SQLAlchemy models
- Supports advanced filtering, pagination, search, sorting, and bulk operations
- Lets you add custom endpoints and business logic with hooks and decorators
- Automatically generates Pydantic response models if you don't provide them

---

## Installation

```bash
pip install FastAPI-AutoCRUD
```

**Requirements:**
- Python 3.12+
- FastAPI 0.115.14+
- SQLAlchemy 2.0.41+ (with async support via greenlet)
- Pydantic 2.11.7+

---

## Quick Start

### 1. Define Your SQLAlchemy Model (2.0 style)

```python
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.dialects.postgresql import UUID
import uuid

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "users"
    id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    username: Mapped[str] = mapped_column(unique=True, index=True)
    email: Mapped[str] = mapped_column(unique=True, index=True)
    # ... other fields ...
```

**Why this matters:** Using `Mapped` and `mapped_column` ensures full SQLAlchemy 2.0 compatibility and type safety.

### 2. Create Pydantic Schemas

```python
from pydantic import BaseModel, EmailStr
from typing import Optional

class UserCreate(BaseModel):
    username: str
    email: EmailStr

class UserUpdate(BaseModel):
    username: Optional[str] = None
    email: Optional[EmailStr] = None
```

### 3. Set Up Async Database Session

```python
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession

DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
engine = create_async_engine(DATABASE_URL)
async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

async def get_session() -> AsyncSession:
    async with async_session() as session:
        yield session
```

### 4. Create CRUD and Router

```python
from auto_crud.core.crud.base import BaseCRUD
from auto_crud.core.crud.router import RouterFactory

user_crud = BaseCRUD[User, uuid.UUID, UserCreate, UserUpdate](model=User)
user_router_factory = RouterFactory(
    crud=user_crud,
    session_factory=get_session,
    create_schema=UserCreate,
    update_schema=UserUpdate,
    prefix="/users",
    tags=["users"],
    enable_pagination=True,
    enable_search=True,
    enable_sorting=True,
    enable_filters=True,
    search_fields=["username", "email"],
    sort_default="-created_at", # sort by created_at in descending order
    page_size=20,
    max_page_size=100,
)
user_router = user_router_factory.get_router()
```

### 5. Register the Router in FastAPI

```python
from fastapi import FastAPI
app = FastAPI()
app.include_router(user_router, prefix="/api/v1")
```

---

## Core Concepts & Features

### 1. CRUD Endpoints (Auto-Generated)

**All endpoints are generated for you:**
- `POST   /users/`         — Create
- `GET    /users/`         — List (with pagination, filtering, search, sorting)
- `GET    /users/{id}`     — Read by ID
- `PUT    /users/{id}`     — Update
- `PATCH  /users/{id}`     — Partial update
- `DELETE /users/{id}`     — Delete
- `POST   /users/bulk`     — Bulk create
- `PUT    /users/bulk`     — Bulk update
- `DELETE /users/bulk`     — Bulk delete

**Explanation:**
- **No need to write these endpoints yourself.** The router factory automatically generates all standard CRUD operations.
- **Bulk endpoints** accept lists of objects (for create/update) or IDs (for delete) for efficient batch operations.
- **All endpoints support dependency injection** for authentication, authorization, and other middleware.
- **HTTP methods are properly mapped:** PUT for full updates, PATCH for partial updates.

### 2. Automatic Pydantic Response Models

If you do **not** provide a response model for an operation, FastAPI-AutoCRUD will **dynamically generate** a Pydantic model from your SQLAlchemy model's columns. This ensures:
- All fields are included
- Types are inferred from your model
- Nullability and defaults are respected

**Best Practice:** For custom serialization or hiding fields, provide your own response model.

### 3. Advanced Filtering System

FastAPI-AutoCRUD provides a sophisticated filtering system with multiple operators and logical combinations.

**Supported Operators:**
- **Comparison:** `eq`, `ne`, `gt`, `ge`, `lt`, `le`
- **Text Search:** `like`, `ilike`, `contains`, `startswith`, `endswith`
- **Collections:** `in`, `not_in`
- **Null Handling:** `is_null`, `is_not_null`
- **Ranges:** `between`
- **Logical:** `and`, `or`, `not`

**Client Usage Examples:**
```
GET /users?filters=status__eq=active
GET /users?filters=age__gte=18,status__in=active,pending
GET /users?filters=created_at__between=2024-01-01,2024-01-31
GET /users?filters=name__ilike=%john%,email__contains=gmail
GET /users?filters=and(field1__eq=value1,field2__gt=10)
```

**Configuration:**
```python
user_router_factory = RouterFactory(
    ...,
    enable_filters=True,
    filter_spec={
        "username": ("eq", "contains", "startswith"),
        "email": ("eq", "ilike"),
        "age": ("eq", "gt", "ge", "lt", "le", "between"),
        "status": ("eq", "in", "not_in"),
    },
)
```

**Explanation:**
- **Security:** Use `filter_spec` to whitelist allowed fields and operators, preventing exposure of sensitive data.
- **Performance:** Restricting operators helps optimize database queries.
- **Flexibility:** Support for complex logical expressions with `and`, `or`, `not` operators.

### 4. Pagination

Pagination is enabled by default and provides comprehensive metadata.

**Query Parameters:**
- `page`: Page number (1-based)
- `size`: Items per page (1-100, configurable)

**Response Structure:**
```json
{
  "items": [...],
  "total": 150,
  "page": 2,
  "size": 20,
  "pages": 8,
  "has_next": true,
  "has_prev": true
}
```

**Configuration:**
```python
user_router_factory = RouterFactory(
    ...,
    enable_pagination=True,
    page_size=20,
    max_page_size=100,
)
```

**Explanation:**
- **Consistent API:** All list endpoints return the same pagination structure.
- **Performance:** Limits result sets to prevent memory issues.
- **Metadata:** Provides all necessary information for building pagination UI.

### 5. Global Search

Global search allows searching across multiple fields simultaneously.

**Configuration:**
```python
user_router_factory = RouterFactory(
    ...,
    enable_search=True,
    search_fields=["username", "email", "full_name"],
)
```

**Client Usage:**
```
GET /users?search=john
```

**Explanation:**
- **Multi-field:** Searches across all specified fields using case-insensitive LIKE queries.
- **Simple Interface:** Single search parameter for complex queries.
- **Performance:** Uses database indexes for efficient searching.

### 6. Sorting

Sorting with configurable field and direction.

**Configuration:**
```python
user_router_factory = RouterFactory(
    ...,
    enable_sorting=True,
    sort_default="-created_at", # sort by created_at in descending order
)
```

**Client Usage:**
```
GET /users?sort_by=-created_at
```

**Explanation:**
- **Direction:** Prefix with `-` for descending order.
- **Default:** Falls back to `sort_default` if no sorting specified.

### 7. Bulk Operations

Efficient batch operations for creating, updating, and deleting multiple records.

**Endpoints:**
- `POST /users/bulk` — Bulk create
- `PUT /users/bulk` — Bulk update  
- `DELETE /users/bulk` — Bulk delete

**Bulk Create Example:**
```json
POST /users/bulk
[
  {"username": "user1", "email": "user1@example.com"},
  {"username": "user2", "email": "user2@example.com"}
]
```

**Bulk Update Example:**
```json
PUT /users/bulk
[
  {"id": "uuid1", "username": "updated1"},
  {"id": "uuid2", "email": "updated2@example.com"}
]
```

**Bulk Delete Example:**
```json
DELETE /users/bulk
["uuid1", "uuid2", "uuid3"]
```

**Response Structure:**
```json
{
  "created": 2,
  "updated": 3,
  "deleted": 1,
  "items": [...],
  "errors": [...]
}
```

**Explanation:**
- **Performance:** Batch operations are much faster than individual requests.
- **Transaction Safety:** All operations within a bulk request are atomic.
- **Error Handling:** Partial failures are reported with detailed error information.

### 8. Prefetching (Eager Loading)

Use the `prefetch` parameter to specify relationships to eager load for performance.

**Configuration:**
```python
user_router_factory = RouterFactory(
    ...,
    prefetch=["posts", "profile"],
)
```

**Explanation:**
- **N+1 Problem:** Prevents the common N+1 query problem when accessing related data.
- **Performance:** Reduces database round trips significantly.
- **Flexibility:** Can be set globally or per-request.

### 9. Custom Actions

Use the `@action` decorator to add custom endpoints to your router factory class.

**Example:**
```python
from auto_crud.core.crud.decorators import action

class UserRouterFactory(RouterFactory[User, uuid.UUID, UserCreate, UserUpdate]):
    @action(method="GET", detail=False, url_path="verified")
    async def get_verified_users(self, session: AsyncSession):
        filters = [
            FilterParam(field="is_verified", operator="eq", value=True)
        ]
        return await self.crud.list_objects(session, filters=filters)

user_router_factory = UserRouterFactory(
    crud=user_crud,
    session_factory=get_session,
    create_schema=UserCreate,
    update_schema=UserUpdate,
    prefix="/users",
    tags=["users"],
    dependencies=[Depends(require_auth)],
    enable_pagination=True,
    enable_search=True,
    enable_sorting=True,
    enable_filters=True,
    search_fields=["username", "email", "full_name"],
    sort_default="-created_at", # sort by created_at in descending order
    page_size=20,
    max_page_size=100,
    prefetch=["profile", "posts"],
    filter_spec={
        "username": ("eq", "contains", "startswith"),
        "email": ("eq", "ilike"),
        "status": ("eq", "in"),
        "created_at": ("eq", "gt", "ge", "lt", "le", "between"),
    },
    response_schemas={
        "create": UserResponse,
        "update": UserResponse,
        "read": UserResponse,
        "list": UserResponse,
    },
)

# 4. Get router and register
user_router = user_router_factory.get_router()
app.include_router(user_router, prefix="/api/v1")
```

---

**For more examples, see the `sample/` directory.**

---

## License
MIT
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "FastAPI-AutoCRUD",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.12",
    "maintainer_email": null,
    "keywords": "api, crud, fastapi, pydantic, rest, router, sqlalchemy",
    "author": null,
    "author_email": "FastAPI-AutoCRUD Contributors <support@autocrud.dev>",
    "download_url": "https://files.pythonhosted.org/packages/46/54/ca38190ccb193bb3260ad88d22a1cfe2a297199f4438221852b047f6089a/fastapi_autocrud-0.1.3.tar.gz",
    "platform": null,
    "description": "# FastAPI-AutoCRUD\n\nA powerful, enterprise-level FastAPI CRUD router factory for SQLAlchemy models. It automatically generates REST endpoints with advanced features: filtering, pagination, searching, sorting, bulk operations, custom endpoint decorators, and lifecycle hooks.\n\n---\n\n## Table of Contents\n- [Overview](#overview)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Core Concepts & Features](#core-concepts--features)\n- [Endpoint Reference](#endpoint-reference)\n- [Advanced Usage](#advanced-usage)\n- [Best Practices](#best-practices)\n- [Troubleshooting](#troubleshooting)\n\n---\n\n## Overview\n\n**FastAPI-AutoCRUD** eliminates boilerplate for CRUD APIs. It:\n- Generates all CRUD endpoints for your SQLAlchemy models\n- Supports advanced filtering, pagination, search, sorting, and bulk operations\n- Lets you add custom endpoints and business logic with hooks and decorators\n- Automatically generates Pydantic response models if you don't provide them\n\n---\n\n## Installation\n\n```bash\npip install FastAPI-AutoCRUD\n```\n\n**Requirements:**\n- Python 3.12+\n- FastAPI 0.115.14+\n- SQLAlchemy 2.0.41+ (with async support via greenlet)\n- Pydantic 2.11.7+\n\n---\n\n## Quick Start\n\n### 1. Define Your SQLAlchemy Model (2.0 style)\n\n```python\nfrom sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column\nfrom sqlalchemy.dialects.postgresql import UUID\nimport uuid\n\nclass Base(DeclarativeBase):\n    pass\n\nclass User(Base):\n    __tablename__ = \"users\"\n    id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)\n    username: Mapped[str] = mapped_column(unique=True, index=True)\n    email: Mapped[str] = mapped_column(unique=True, index=True)\n    # ... other fields ...\n```\n\n**Why this matters:** Using `Mapped` and `mapped_column` ensures full SQLAlchemy 2.0 compatibility and type safety.\n\n### 2. Create Pydantic Schemas\n\n```python\nfrom pydantic import BaseModel, EmailStr\nfrom typing import Optional\n\nclass UserCreate(BaseModel):\n    username: str\n    email: EmailStr\n\nclass UserUpdate(BaseModel):\n    username: Optional[str] = None\n    email: Optional[EmailStr] = None\n```\n\n### 3. Set Up Async Database Session\n\n```python\nfrom sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession\n\nDATABASE_URL = \"postgresql+asyncpg://user:password@localhost/dbname\"\nengine = create_async_engine(DATABASE_URL)\nasync_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)\n\nasync def get_session() -> AsyncSession:\n    async with async_session() as session:\n        yield session\n```\n\n### 4. Create CRUD and Router\n\n```python\nfrom auto_crud.core.crud.base import BaseCRUD\nfrom auto_crud.core.crud.router import RouterFactory\n\nuser_crud = BaseCRUD[User, uuid.UUID, UserCreate, UserUpdate](model=User)\nuser_router_factory = RouterFactory(\n    crud=user_crud,\n    session_factory=get_session,\n    create_schema=UserCreate,\n    update_schema=UserUpdate,\n    prefix=\"/users\",\n    tags=[\"users\"],\n    enable_pagination=True,\n    enable_search=True,\n    enable_sorting=True,\n    enable_filters=True,\n    search_fields=[\"username\", \"email\"],\n    sort_default=\"-created_at\", # sort by created_at in descending order\n    page_size=20,\n    max_page_size=100,\n)\nuser_router = user_router_factory.get_router()\n```\n\n### 5. Register the Router in FastAPI\n\n```python\nfrom fastapi import FastAPI\napp = FastAPI()\napp.include_router(user_router, prefix=\"/api/v1\")\n```\n\n---\n\n## Core Concepts & Features\n\n### 1. CRUD Endpoints (Auto-Generated)\n\n**All endpoints are generated for you:**\n- `POST   /users/`         \u2014 Create\n- `GET    /users/`         \u2014 List (with pagination, filtering, search, sorting)\n- `GET    /users/{id}`     \u2014 Read by ID\n- `PUT    /users/{id}`     \u2014 Update\n- `PATCH  /users/{id}`     \u2014 Partial update\n- `DELETE /users/{id}`     \u2014 Delete\n- `POST   /users/bulk`     \u2014 Bulk create\n- `PUT    /users/bulk`     \u2014 Bulk update\n- `DELETE /users/bulk`     \u2014 Bulk delete\n\n**Explanation:**\n- **No need to write these endpoints yourself.** The router factory automatically generates all standard CRUD operations.\n- **Bulk endpoints** accept lists of objects (for create/update) or IDs (for delete) for efficient batch operations.\n- **All endpoints support dependency injection** for authentication, authorization, and other middleware.\n- **HTTP methods are properly mapped:** PUT for full updates, PATCH for partial updates.\n\n### 2. Automatic Pydantic Response Models\n\nIf you do **not** provide a response model for an operation, FastAPI-AutoCRUD will **dynamically generate** a Pydantic model from your SQLAlchemy model's columns. This ensures:\n- All fields are included\n- Types are inferred from your model\n- Nullability and defaults are respected\n\n**Best Practice:** For custom serialization or hiding fields, provide your own response model.\n\n### 3. Advanced Filtering System\n\nFastAPI-AutoCRUD provides a sophisticated filtering system with multiple operators and logical combinations.\n\n**Supported Operators:**\n- **Comparison:** `eq`, `ne`, `gt`, `ge`, `lt`, `le`\n- **Text Search:** `like`, `ilike`, `contains`, `startswith`, `endswith`\n- **Collections:** `in`, `not_in`\n- **Null Handling:** `is_null`, `is_not_null`\n- **Ranges:** `between`\n- **Logical:** `and`, `or`, `not`\n\n**Client Usage Examples:**\n```\nGET /users?filters=status__eq=active\nGET /users?filters=age__gte=18,status__in=active,pending\nGET /users?filters=created_at__between=2024-01-01,2024-01-31\nGET /users?filters=name__ilike=%john%,email__contains=gmail\nGET /users?filters=and(field1__eq=value1,field2__gt=10)\n```\n\n**Configuration:**\n```python\nuser_router_factory = RouterFactory(\n    ...,\n    enable_filters=True,\n    filter_spec={\n        \"username\": (\"eq\", \"contains\", \"startswith\"),\n        \"email\": (\"eq\", \"ilike\"),\n        \"age\": (\"eq\", \"gt\", \"ge\", \"lt\", \"le\", \"between\"),\n        \"status\": (\"eq\", \"in\", \"not_in\"),\n    },\n)\n```\n\n**Explanation:**\n- **Security:** Use `filter_spec` to whitelist allowed fields and operators, preventing exposure of sensitive data.\n- **Performance:** Restricting operators helps optimize database queries.\n- **Flexibility:** Support for complex logical expressions with `and`, `or`, `not` operators.\n\n### 4. Pagination\n\nPagination is enabled by default and provides comprehensive metadata.\n\n**Query Parameters:**\n- `page`: Page number (1-based)\n- `size`: Items per page (1-100, configurable)\n\n**Response Structure:**\n```json\n{\n  \"items\": [...],\n  \"total\": 150,\n  \"page\": 2,\n  \"size\": 20,\n  \"pages\": 8,\n  \"has_next\": true,\n  \"has_prev\": true\n}\n```\n\n**Configuration:**\n```python\nuser_router_factory = RouterFactory(\n    ...,\n    enable_pagination=True,\n    page_size=20,\n    max_page_size=100,\n)\n```\n\n**Explanation:**\n- **Consistent API:** All list endpoints return the same pagination structure.\n- **Performance:** Limits result sets to prevent memory issues.\n- **Metadata:** Provides all necessary information for building pagination UI.\n\n### 5. Global Search\n\nGlobal search allows searching across multiple fields simultaneously.\n\n**Configuration:**\n```python\nuser_router_factory = RouterFactory(\n    ...,\n    enable_search=True,\n    search_fields=[\"username\", \"email\", \"full_name\"],\n)\n```\n\n**Client Usage:**\n```\nGET /users?search=john\n```\n\n**Explanation:**\n- **Multi-field:** Searches across all specified fields using case-insensitive LIKE queries.\n- **Simple Interface:** Single search parameter for complex queries.\n- **Performance:** Uses database indexes for efficient searching.\n\n### 6. Sorting\n\nSorting with configurable field and direction.\n\n**Configuration:**\n```python\nuser_router_factory = RouterFactory(\n    ...,\n    enable_sorting=True,\n    sort_default=\"-created_at\", # sort by created_at in descending order\n)\n```\n\n**Client Usage:**\n```\nGET /users?sort_by=-created_at\n```\n\n**Explanation:**\n- **Direction:** Prefix with `-` for descending order.\n- **Default:** Falls back to `sort_default` if no sorting specified.\n\n### 7. Bulk Operations\n\nEfficient batch operations for creating, updating, and deleting multiple records.\n\n**Endpoints:**\n- `POST /users/bulk` \u2014 Bulk create\n- `PUT /users/bulk` \u2014 Bulk update  \n- `DELETE /users/bulk` \u2014 Bulk delete\n\n**Bulk Create Example:**\n```json\nPOST /users/bulk\n[\n  {\"username\": \"user1\", \"email\": \"user1@example.com\"},\n  {\"username\": \"user2\", \"email\": \"user2@example.com\"}\n]\n```\n\n**Bulk Update Example:**\n```json\nPUT /users/bulk\n[\n  {\"id\": \"uuid1\", \"username\": \"updated1\"},\n  {\"id\": \"uuid2\", \"email\": \"updated2@example.com\"}\n]\n```\n\n**Bulk Delete Example:**\n```json\nDELETE /users/bulk\n[\"uuid1\", \"uuid2\", \"uuid3\"]\n```\n\n**Response Structure:**\n```json\n{\n  \"created\": 2,\n  \"updated\": 3,\n  \"deleted\": 1,\n  \"items\": [...],\n  \"errors\": [...]\n}\n```\n\n**Explanation:**\n- **Performance:** Batch operations are much faster than individual requests.\n- **Transaction Safety:** All operations within a bulk request are atomic.\n- **Error Handling:** Partial failures are reported with detailed error information.\n\n### 8. Prefetching (Eager Loading)\n\nUse the `prefetch` parameter to specify relationships to eager load for performance.\n\n**Configuration:**\n```python\nuser_router_factory = RouterFactory(\n    ...,\n    prefetch=[\"posts\", \"profile\"],\n)\n```\n\n**Explanation:**\n- **N+1 Problem:** Prevents the common N+1 query problem when accessing related data.\n- **Performance:** Reduces database round trips significantly.\n- **Flexibility:** Can be set globally or per-request.\n\n### 9. Custom Actions\n\nUse the `@action` decorator to add custom endpoints to your router factory class.\n\n**Example:**\n```python\nfrom auto_crud.core.crud.decorators import action\n\nclass UserRouterFactory(RouterFactory[User, uuid.UUID, UserCreate, UserUpdate]):\n    @action(method=\"GET\", detail=False, url_path=\"verified\")\n    async def get_verified_users(self, session: AsyncSession):\n        filters = [\n            FilterParam(field=\"is_verified\", operator=\"eq\", value=True)\n        ]\n        return await self.crud.list_objects(session, filters=filters)\n\nuser_router_factory = UserRouterFactory(\n    crud=user_crud,\n    session_factory=get_session,\n    create_schema=UserCreate,\n    update_schema=UserUpdate,\n    prefix=\"/users\",\n    tags=[\"users\"],\n    dependencies=[Depends(require_auth)],\n    enable_pagination=True,\n    enable_search=True,\n    enable_sorting=True,\n    enable_filters=True,\n    search_fields=[\"username\", \"email\", \"full_name\"],\n    sort_default=\"-created_at\", # sort by created_at in descending order\n    page_size=20,\n    max_page_size=100,\n    prefetch=[\"profile\", \"posts\"],\n    filter_spec={\n        \"username\": (\"eq\", \"contains\", \"startswith\"),\n        \"email\": (\"eq\", \"ilike\"),\n        \"status\": (\"eq\", \"in\"),\n        \"created_at\": (\"eq\", \"gt\", \"ge\", \"lt\", \"le\", \"between\"),\n    },\n    response_schemas={\n        \"create\": UserResponse,\n        \"update\": UserResponse,\n        \"read\": UserResponse,\n        \"list\": UserResponse,\n    },\n)\n\n# 4. Get router and register\nuser_router = user_router_factory.get_router()\napp.include_router(user_router, prefix=\"/api/v1\")\n```\n\n---\n\n**For more examples, see the `sample/` directory.**\n\n---\n\n## License\nMIT",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A powerful, enterprise-level FastAPI CRUD router factory that automatically generates REST endpoints with advanced features like filtering, pagination, searching, sorting, bulk operations, and custom endpoint decorators.",
    "version": "0.1.3",
    "project_urls": null,
    "split_keywords": [
        "api",
        " crud",
        " fastapi",
        " pydantic",
        " rest",
        " router",
        " sqlalchemy"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0c73a797e9c0ac262cecf740321d4cd416b7b38b575af1da40a02a5139c08e89",
                "md5": "608c1b927a17ba60c3871c43a05e6c90",
                "sha256": "172276e8ae809013a51c0bbe1bc99b6eedbb8f6adbaefd0ed5a91f357b66e970"
            },
            "downloads": -1,
            "filename": "fastapi_autocrud-0.1.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "608c1b927a17ba60c3871c43a05e6c90",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.12",
            "size": 31381,
            "upload_time": "2025-07-28T13:49:10",
            "upload_time_iso_8601": "2025-07-28T13:49:10.051105Z",
            "url": "https://files.pythonhosted.org/packages/0c/73/a797e9c0ac262cecf740321d4cd416b7b38b575af1da40a02a5139c08e89/fastapi_autocrud-0.1.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4654ca38190ccb193bb3260ad88d22a1cfe2a297199f4438221852b047f6089a",
                "md5": "929cdb9a7fa175b04bf95f6e1000fa98",
                "sha256": "bc6c133c3c9cfc61f811c3b0a1fbba2674b4e77b13a82136a754e61e725c8559"
            },
            "downloads": -1,
            "filename": "fastapi_autocrud-0.1.3.tar.gz",
            "has_sig": false,
            "md5_digest": "929cdb9a7fa175b04bf95f6e1000fa98",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.12",
            "size": 28557,
            "upload_time": "2025-07-28T13:49:11",
            "upload_time_iso_8601": "2025-07-28T13:49:11.260971Z",
            "url": "https://files.pythonhosted.org/packages/46/54/ca38190ccb193bb3260ad88d22a1cfe2a297199f4438221852b047f6089a/fastapi_autocrud-0.1.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-28 13:49:11",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "fastapi-autocrud"
}
        
Elapsed time: 0.72790s