A better CRUD library for FastAPI.
Project description
BetterCRUD
A better CRUD library for FastAPI.
FastAPI CRUD routing library based on class view, you can control everything
Documentation: https://bigrivi.github.io/better_crud/
Source Code: https://github.com/bigrivi/better_crud
BetterCRUD is a library that can quickly generate CRUD routes for you without any intrusion to your code. You can still control everything. When you are troubled by a large number of repeated CRUD routes, I believe it can help you, saving you a lot of time and allowing you to focus more on business logic.
BetterCRUD is reliable, fully tested, and used in project production environments.
BetterCRUD is a way to dynamically generate routes by combining your model with the crud decorator,I believe bring you a different development experience
You only need to configure some crud options and define your model to produce powerful CRUD functions
@crud(
router,
dto={
"create": PetCreate,
"update": PetUpdate
},
serialize={
"base": PetPublic,
},
**other_options
)
class PetController():
service: PetService = Depends(PetService)
Requirements
- Python: Version 3.9 or newer.
- FastAPI: BetterCRUD is built to work with FastAPI, so having FastAPI in your project is essential.
- SQLAlchemy: Version 2.0.30 or newer. BetterCRUD uses SQLAlchemy for database operations.
- Pydantic: Version 2.7.3 or newer. BetterCRUD leverages Pydantic models for data validation and serialization.
Installation
pip install better-crud
Features
- Fully Async, Synchronization is not supported
- Less boilerplate code
- Configuring static type support
- More flexible custom configuration,Less invasive
- Compatible with both class views and functional views
- Rich filter, pagination, and sorting support
- Automated relationship support, query and storage
- Extensible custom backend
Default Routes
Route | Method | Description |
---|---|---|
/resource | GET | Get Many |
/resource/{id} | GET | Get One |
/resource | POST | Create One |
/resource/bulk | POST | Create Many |
/resource/{id} | PUT | Update One |
/resource/{ids}/bulk | PUT | Update Many |
/resource/{ids} | DELETE | Delete Many |
Minimal Example
Prerequisites,Prepare our db, Only asynchronous mode is supported,aiomysql or aiosqlite db.py
from sqlalchemy.orm import DeclarativeBase, declared_attr
from typing import AsyncGenerator
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import NullPool
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
DATABASE_URL = "sqlite+aiosqlite:///crud.db"
class MappedBase(DeclarativeBase):
@declared_attr.directive
def __tablename__(cls) -> str:
return cls.__name__.lower()
class Base(MappedBase):
__abstract__ = True
engine = create_async_engine(
DATABASE_URL,
echo=False,
poolclass=NullPool
)
SessionLocal = sessionmaker(
autocommit=False,
autoflush=False,
bind=engine,
class_=AsyncSession,
expire_on_commit=False,
)
async def get_session() -> AsyncGenerator[AsyncSession, None]:
async with SessionLocal() as session:
yield session
async def init_db():
async with engine.begin() as conn:
await conn.run_sync(MappedBase.metadata.create_all)
First Define Your Model And Schema
model.py
from sqlalchemy import String, Integer, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
from .db import Base
class Pet(Base):
__tablename__ = "pet"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
name: Mapped[str] = mapped_column(String(100))
description: Mapped[str] = mapped_column(String(100))
schema.py
from typing import Optional, List
from pydantic import BaseModel
class PetBase(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
class PetPublic(PetBase):
id: int
class PetCreate(PetBase):
pass
class PetUpdate(PetBase):
pass
Next we need to create a service:
service.py
from better_crud.service.sqlalchemy import SqlalchemyCrudService
from .model import Pet
class PetService(SqlalchemyCrudService[Pet]):
def __init__(self):
super().__init__(Pet)
Next we need to define the controller and decorate it with the crud decorator Sure the controller is just a normal class,The crud decorator gives it super powers controller.py
from fastapi import APIRouter, Depends
from better_crud import crud
from .schema import PetCreate, PetUpdate, PetPublic
from .service import PetService
pet_router = APIRouter()
@crud(
pet_router,
dto={
"create": PetCreate,
"update": PetUpdate
},
serialize={
"base": PetPublic,
}
)
class PetController():
service: PetService = Depends(PetService)
Next we can register router to the fastapi routing system
main.py
from better_crud import BetterCrudGlobalConfig
from fastapi import FastAPI
from contextlib import asynccontextmanager
from .db import get_session, init_db
BetterCrudGlobalConfig.init(
backend_config={
"sqlalchemy": {
"db_session": get_session
}
}
)
@asynccontextmanager
async def lifespan(_: FastAPI):
await init_db()
# Shutdown
yield
app = FastAPI(lifespan=lifespan)
def register_router():
from app.controller import pet_router
app.include_router(pet_router, prefix="/pet")
register_router()
Congratulations, your first CRUD route has been created!
Author
👤 bigrivi
- GitHub: bigrivi
🤝 Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
Credits
This project draws inspiration from the following frameworks:
License
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
File details
Details for the file better_crud-0.1.6.tar.gz
.
File metadata
- Download URL: better_crud-0.1.6.tar.gz
- Upload date:
- Size: 23.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 50c1197e79d34a8f9597f7c613fa1b7669c2e8d813dd21b28aa274c05949d70a |
|
MD5 | d32f10408d1b58ed2999bc7a6b0aaa82 |
|
BLAKE2b-256 | 374d9d9dfaa90924930b0b6533e86f5c1c7abae3f2cf11bc1e0caffa0cd327be |
Provenance
The following attestation bundles were made for better_crud-0.1.6.tar.gz
:
Publisher:
publish.yml
on bigrivi/better_crud
-
Statement:
- Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
better_crud-0.1.6.tar.gz
- Subject digest:
50c1197e79d34a8f9597f7c613fa1b7669c2e8d813dd21b28aa274c05949d70a
- Sigstore transparency entry: 232441676
- Sigstore integration time:
- Permalink:
bigrivi/better_crud@7469b833befb394dbfa7a4e863a08aeb8b335879
- Branch / Tag:
refs/tags/v0.1.6
- Owner: https://github.com/bigrivi
- Access:
public
- Token Issuer:
https://token.actions.githubusercontent.com
- Runner Environment:
github-hosted
- Publication workflow:
publish.yml@7469b833befb394dbfa7a4e863a08aeb8b335879
- Trigger Event:
release
- Statement type:
File details
Details for the file better_crud-0.1.6-py3-none-any.whl
.
File metadata
- Download URL: better_crud-0.1.6-py3-none-any.whl
- Upload date:
- Size: 25.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d081d576fbd1d584bd2de84c9388fc95baef567daa96ba7bf989626fcba31186 |
|
MD5 | 3943440892292e92e6de0833ed139bc4 |
|
BLAKE2b-256 | 61355477c1bac506bf0393ac47418a5151408fd75abcab9062032a49902b1a6b |
Provenance
The following attestation bundles were made for better_crud-0.1.6-py3-none-any.whl
:
Publisher:
publish.yml
on bigrivi/better_crud
-
Statement:
- Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
better_crud-0.1.6-py3-none-any.whl
- Subject digest:
d081d576fbd1d584bd2de84c9388fc95baef567daa96ba7bf989626fcba31186
- Sigstore transparency entry: 232441677
- Sigstore integration time:
- Permalink:
bigrivi/better_crud@7469b833befb394dbfa7a4e863a08aeb8b335879
- Branch / Tag:
refs/tags/v0.1.6
- Owner: https://github.com/bigrivi
- Access:
public
- Token Issuer:
https://token.actions.githubusercontent.com
- Runner Environment:
github-hosted
- Publication workflow:
publish.yml@7469b833befb394dbfa7a4e863a08aeb8b335879
- Trigger Event:
release
- Statement type: