Skip to main content

FastCRUD is a Python package for FastAPI, offering robust async CRUD operations and flexible endpoint creation utilities.

Project description

FastCRUD written in white with a drawing of a gear and inside this gear a bolt.

Powerful CRUD methods and automatic endpoint creation for FastAPI.

Tests PyPi Version Supported Python Versions DeepWiki


FastCRUD is a Python package for FastAPI, offering robust async CRUD operations and flexible endpoint creation utilities, streamlined through advanced features like auto-detected join conditions, dynamic sorting, and offset and cursor pagination.

Documentation: benavlabs.github.io/fastcrud

Discord Community: Join our Discord server

Also take a look at CRUDAdmin - Modern admin interface for FastAPI


Features

  • ⚡️ Fully Async: Leverages Python's async capabilities for non-blocking database operations.
  • 📚 SQLAlchemy 2.0: Works with the latest SQLAlchemy version for robust database interactions.
  • 🦾 Powerful CRUD Functionality: Full suite of efficient CRUD operations with support for joins.
  • ⚙️ Dynamic Query Building: Supports building complex queries dynamically, including filtering, sorting, and pagination.
  • 🤝 Advanced Join Operations: Facilitates performing SQL joins with other models with automatic join condition detection.
  • 📖 Built-in Offset Pagination: Comes with ready-to-use offset pagination.
  • Cursor-based Pagination: Implements efficient pagination for large datasets, ideal for infinite scrolling interfaces.
  • 🤸‍♂️ Modular and Extensible: Designed for easy extension and customization to fit your requirements.
  • 🛣️ Auto-generated Endpoints: Streamlines the process of adding CRUD endpoints with custom dependencies and configurations.

Requirements

Before installing FastCRUD, ensure you have the following prerequisites:

  • Python: Version 3.10 or newer.
  • FastAPI: FastCRUD is built to work with FastAPI, so having FastAPI in your project is essential.
  • SQLAlchemy: Version 2.0.21 or newer. FastCRUD uses SQLAlchemy for database operations.
  • Pydantic: Version 2.4.1 or newer. FastCRUD leverages Pydantic models for data validation and serialization.
  • SQLAlchemy-Utils: Optional, but recommended for additional SQLAlchemy utilities.

⚠️ Warning: If you are using a non-native column type (such as those from sqlalchemy-utils) in your models, you may encounter a NotImplementedError. In such cases, you need to add a python_type attribute to your column type. For more details and a discussion on this issue, see this pull request.

Installing

To install, just run:

pip install fastcrud

Or, if using UV:

uv add fastcrud

Usage

FastCRUD offers two primary ways to use its functionalities:

  1. By using crud_router for automatic endpoint creation.
  2. By integrating FastCRUD directly into your FastAPI endpoints for more control.

Below are examples demonstrating both approaches:

Using crud_router for Automatic Endpoint Creation

Here's a quick example to get you started:

Define Your Model and Schema

models.py

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import DeclarativeBase

class Base(DeclarativeBase):
    pass

class Item(Base):
    __tablename__ = 'items'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    description = Column(String)

schemas.py

from pydantic import BaseModel

class ItemCreateSchema(BaseModel):
    name: str
    description: str

class ItemUpdateSchema(BaseModel):
    name: str
    description: str

Set Up FastAPI and FastCRUD

main.py

from typing import AsyncGenerator

from fastapi import FastAPI
from fastcrud import FastCRUD, crud_router
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker

from yourapp.models import Base, Item
from yourapp.schemas import ItemCreateSchema, ItemUpdateSchema

# Database setup (Async SQLAlchemy)
DATABASE_URL = "sqlite+aiosqlite:///./test.db"
engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

# Database session dependency
async def get_session() -> AsyncGenerator[AsyncSession, None]:
    async with async_session() as session:
        yield session

# Create tables before the app start
async def lifespan(app: FastAPI):
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    yield

# FastAPI app
app = FastAPI(lifespan=lifespan)

# CRUD router setup
item_router = crud_router(
    session=get_session,
    model=Item,
    create_schema=ItemCreateSchema,
    update_schema=ItemUpdateSchema,
    path="/items",
    tags=["Items"],
)

app.include_router(item_router)

Using FastCRUD in User-Defined FastAPI Endpoints

For more control over your endpoints, you can use FastCRUD directly within your custom FastAPI route functions. Here's an example:

main.py

from typing import AsyncGenerator

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from fastcrud import FastCRUD

from models import Base, Item
from schemas import ItemCreateSchema, ItemUpdateSchema

# Database setup (Async SQLAlchemy)
DATABASE_URL = "sqlite+aiosqlite:///./test.db"
engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

# Database session dependency
async def get_session() -> AsyncGenerator[AsyncSession, None]:
    async with async_session() as session:
        yield session

# Create tables before the app start
async def lifespan(app: FastAPI):
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    yield

# FastAPI app
app = FastAPI(lifespan=lifespan)

# Instantiate FastCRUD with your model
item_crud = FastCRUD(Item)

@app.post("/custom/items/")
async def create_item(
    item_data: ItemCreateSchema, db: AsyncSession = Depends(get_session)
):
    return await item_crud.create(db, item_data)

@app.get("/custom/items/{item_id}")
async def read_item(item_id: int, db: AsyncSession = Depends(get_session)):
    item = await item_crud.get(db, id=item_id)
    if not item:
        raise HTTPException(status_code=404, detail="Item not found")
    return item

# You can add more routes for update and delete operations in a similar fashion

In this example, we define custom endpoints for creating and reading items using FastCRUD directly, providing more flexibility in how the endpoints are structured and how the responses are handled.

To read more detailed descriptions, go to the documentation.

🧠 DeepWiki Docs: deepwiki.com/benavlabs/FastAPI-boilerplate

Showcase

Browse our showcase to see projects and tutorials built with FastCRUD:

  • 🚀 Applications: Web apps and services powered by FastCRUD
  • 📖 Open Source: Libraries and tools built with FastCRUD
  • 📝 Tutorials: Learn how to build with FastCRUD

Featured Projects

Share Your Project

Built something with FastCRUD? We'd love to feature it! Submit your project through our showcase submission process.

References

Similar Projects

License

MIT

Contact

Benav Labs – benav.io github.com/benavlabs


Powered by Benav Labs - benav.io

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastcrud-0.21.0.tar.gz (79.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastcrud-0.21.0-py3-none-any.whl (107.2 kB view details)

Uploaded Python 3

File details

Details for the file fastcrud-0.21.0.tar.gz.

File metadata

  • Download URL: fastcrud-0.21.0.tar.gz
  • Upload date:
  • Size: 79.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.30

File hashes

Hashes for fastcrud-0.21.0.tar.gz
Algorithm Hash digest
SHA256 38990a96d4639e65e6f1c9b8f4cebfe5bf1a84ba731eb5c224fff593a7316e02
MD5 db8dca78fa11cc7cce519597d4a0b876
BLAKE2b-256 915c2ee44d6cc63cc1f039cb218ea2681d6978c3a27b094e2a4bdf02f503f599

See more details on using hashes here.

File details

Details for the file fastcrud-0.21.0-py3-none-any.whl.

File metadata

  • Download URL: fastcrud-0.21.0-py3-none-any.whl
  • Upload date:
  • Size: 107.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.30

File hashes

Hashes for fastcrud-0.21.0-py3-none-any.whl
Algorithm Hash digest
SHA256 94daa5ca7815a268b700ee31b36455a8248a1a0547f3fcef5969df0047aab338
MD5 26aca4a385a49b186a64f31adba63fc9
BLAKE2b-256 5f1b85fb4c1cb771845e5ede668ef28c090e021020d117e891fa1e599c9e32d1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page