Skip to main content

Common toolkit for FastAPI + SQLAlchemy projects: async DB sessions, base CRUD, settings with AWS Secrets Manager

Project description

fastapi-toolkit

PyPI version Python License: MIT

Common toolkit for FastAPI + SQLAlchemy 2.0 projects: async DB sessions, base CRUD, settings with AWS Secrets Manager.

Features

  • Async database sessions — multi-database support with context-managed sessions
  • Base CRUD — generic async CRUD operations (list, get, create, update, delete, get_or_create)
  • Declarative base model — SQLAlchemy declarative base with automatic table naming
  • Settings management — pydantic-settings with cached AWS Secrets Manager integration
  • Type-safe — full type hints with py.typed marker

Installation

pip install fastapi-toolkit

With AWS Secrets Manager support:

pip install fastapi-toolkit[aws]

Quick Start

Database Setup

from fastapi_toolkit import init_db, async_session

# Initialize on app startup
init_db("postgresql+asyncpg://user:pass@localhost/mydb")

# Use sessions
async with async_session() as session:
    result = await session.execute(...)

Models

from sqlalchemy import String
from sqlalchemy.orm import Mapped, mapped_column
from fastapi_toolkit import BaseModel


class User(BaseModel):
    __table_name__ = "users"

    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(100))
    email: Mapped[str] = mapped_column(String(200))

CRUD

from fastapi_toolkit import BaseCRUD

user_crud = BaseCRUD(User)

# List
users = await user_crud.list()

# Get by condition
user = await user_crud.get(User.id == 1)

# Create
user = await user_crud.create(name="Alice", email="alice@example.com")

# Update
await user_crud.update(User.id == 1, name="Bob")

# Delete
await user_crud.delete(User.id == 1)

# Get or create
user, created = await user_crud.get_or_create(
    User.email == "alice@example.com",
    name="Alice",
    email="alice@example.com",
)

Settings with AWS Secrets Manager

from fastapi_toolkit import BaseSettings, SecretSettings, EscapedSecretStr


class MySecrets(SecretSettings):
    db_password: EscapedSecretStr = None
    api_key: str = ""


class Settings(BaseSettings[MySecrets]):
    project: str = "myapp"
    environment: str = "dev"
    region: str = "us-east-1"
    secret_model: type = MySecrets


settings = Settings()

# Secrets are loaded from AWS Secrets Manager, cached with TTL
secrets = await settings.get_secret()

Multi-Database Support

from fastapi_toolkit import init_db, BaseCRUD

# Initialize multiple databases
init_db("postgresql+asyncpg://localhost/primary", database="default")
init_db("postgresql+asyncpg://localhost/analytics", database="analytics")


# Use specific database in CRUD
class AnalyticsCRUD(BaseCRUD):
    database = "analytics"

analytics_crud = AnalyticsCRUD(Event)

API Reference

init_db(database_dsn, database="default", engine_kwargs=None, session_maker_kwargs=None)

Initialize an async database engine and session factory.

async_session(exists_session=None, database="default")

Async context manager for database sessions. Reuses existing session if provided.

BaseCRUD(model)

Generic async CRUD class with methods:

Method Description
list(condition, joins, order_by, limit, offset, fields, unique, session) List records with filtering and pagination
count(condition, joins, session) Count matching records
get(condition, joins, session) Get single record
create(session, commit, **kwargs) Create a record
bulk_create(items, session, commit) Bulk create records
update(condition, session, commit, **kwargs) Update matching records
delete(condition, session, commit) Delete matching records
get_or_create(condition, session, commit, **defaults) Get existing or create new

BaseSettings[T]

Pydantic settings with cached AWS Secrets Manager:

Property / Method Description
secret_name Auto-generated secret name: {environment}/{project}
await get_secret() Load and cache secret (non-blocking)

Development

# Clone the repository
git clone https://github.com/timaakulich/fastapi-toolkit.git
cd fastapi-toolkit

# Install dev dependencies
pip install -e ".[dev]"

# Run linter
ruff check .

# Run type checker
mypy fastapi_toolkit

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License — see the LICENSE file for details.

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

fastapi_toolkit-0.1.2.tar.gz (9.0 kB view details)

Uploaded Source

Built Distribution

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

fastapi_toolkit-0.1.2-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_toolkit-0.1.2.tar.gz.

File metadata

  • Download URL: fastapi_toolkit-0.1.2.tar.gz
  • Upload date:
  • Size: 9.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for fastapi_toolkit-0.1.2.tar.gz
Algorithm Hash digest
SHA256 9cb11f6e7f6037d7f43e3aa683c6be9f2e9548c154401e318c1d3092a467aecd
MD5 e63d61cf033f5b1c419445c0f3a54b5d
BLAKE2b-256 d6b2091a4b5ebde73c2bd3896a4d03fd9b460f14ac2d94e1a47e5db89c8de9ed

See more details on using hashes here.

File details

Details for the file fastapi_toolkit-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_toolkit-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ec57a91dabc96649d53f69e1efdde67d3583345742bcd0e8891080e2ad34d843
MD5 848d7941e4e41374a5c5ae48aae94f30
BLAKE2b-256 8e38483f35b8d3bad1d6e3e37981d37e29fb0bc55b6303934445c534ad77c853

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