Skip to content

Integration of FastAPI framework supported by Pydantic with SQLAlchemy ORM and PostgreSQL on asyncpg driver

License

Notifications You must be signed in to change notification settings

grillazz/fastapi-sqlalchemy-asyncpg

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

fastapi-sqlalchemy-asyncpg

Contributors Forks Stargazers Issues MIT License LinkedIn

fastapi-sqlalchemy-asyncpg

Table of Contents
  1. About The Project
  2. Getting Started
  3. Acknowledgments

About The Project

This example demonstrates the seamless integration of FastAPI, a modern, high-performance web framework, with Pydantic 2.0, a robust and powerful data validation library. The integration is further enhanced by the use of SQLAlchemy ORM, a popular and feature-rich Object-Relational Mapping tool, and PostgreSQL17 relational database.

The entire stack is connected using the asyncpg Database Client Library, which provides a robust and efficient way to interact with PostgreSQL databases in Python, leveraging the power of asyncio and event loops.

Notably, this example showcases the latest and greatest versions of SQLAlchemy and psycopg, which are renowned for their robustness, power, and speed. The inclusion of FastAPI adds a modern, fast, and high-performance web framework to the mix allowing for the rapid development of APIs with Python 3.8+.

FastAPI has received significant recognition in the industry, including a review on thoughtworks Technology Radar in April 2021, where it was classified as a Trial technology, with comments praising its performance, ease of use, and features such as API documentation using OpenAPI. Additionally, FastAPI was recognized in the Python Developers Survey 2023 Results, conducted by the Python Software Foundation and JetBrains, where it was reported that 1 in 4 Python developers use FastAPI, with a 4 percentage point increase from the previous year.

Built With

FastAPI Pydantic SQLAlchemy Uvicorn pytest asyncpg alembic rich

(back to top)

Getting Started

Make will help you

To build , run and test and more ... use magic of make help to play with this project.

1. make docker-build
2. make docker-up > alternatively > make docker-up-granian
3. make docker-apply-db-migrations
4. make docker-feed-database

Adjust make with just

(back to top)

How to feed database

It took me a while to find nice data set. Hope works of Shakespeare as example will be able to cover first part with read only declarative base configuration and all type of funny selects :) Data set is coming form https://github.com/catherinedevlin/opensourceshakespeare Next models were generated with https://github.com/agronholm/sqlacodegen

(back to top)

Rainbow logs with rich 🌈

To enhance the developer experience when viewing logs with extensive information from multiple emitters (which are particularly useful during development), this project uses the rich library. Event with the superpowers of rich, reading logs can be challenging. The rich library is highly beneficial, but integrating it properly as a logger object and maintaining it as a singleton took some effort.

To address the following needs:

  • Difficulty in finding specific information in logs.
  • Avoiding the complexity of setting up an ELK stack for log management.
  • Speeding up the debugging process.

he following steps were taken to integrate rich into the project:

  1. Configure emitters using the logging-uvicorn.json or use logging-granian.json for granian
  2. Eliminate duplicates, such as SQLAlchemy echo, by using separate handlers.
  3. Maintain the logger as a singleton to prevent multiple instances.
  4. Add the --log-config ./logging-uvicorn.json parameter to Uvicorn or --log-config ./logging-granian.json to Granian.

sample-logs-with-rich

(back to top)

Setup User Auth

Setup user authentication with JWT and Redis as token storage.

Setup local env with uv

uv sync
source .venv/bin/activate

Import xlsx files with polars and calamine

Power of Polars Library in data manipulation and analysis. It uses the polars library to read the Excel data into a DataFrame by passing the bytes to the pl.read_excel() function - https://docs.pola.rs/py-polars/html/reference/api/polars.read_excel.html In pl.read_excel() β€œcalamine” engine can be used for reading all major types of Excel Workbook (.xlsx, .xlsb, .xls) and is dramatically faster than the other options, using the fastexcel module to bind calamine.

(back to top)

Worker aware async scheduler

The project uses the APScheduler library to schedule tasks in the background. The APScheduler library is a powerful and flexible in-process task scheduler with Cron-like capabilities. It allows you to schedule jobs to run at specific times or intervals, and it supports multiple job stores, triggers, and executors. The library is designed to be easy to use and highly configurable, making it suitable for a wide range of use cases. It was added to project in version 4.0.0a5 with Redis as event broker and SQLAlchemy as data store.

(back to top)

SMTP setup

The project uses the smtplib library to send emails. The smtplib library is a built-in Python library that provides a simple interface for sending emails using the Simple Mail Transfer Protocol (SMTP). It allows you to connect to an SMTP server, send an email message, and disconnect from the server. The library is easy to use and provides a flexible and powerful way to send emails from your Python applications.

SMTPEmailService provides a reusable interface to send emails via an SMTP server. This service supports plaintext and HTML emails, and also allows sending template-based emails using the Jinja2 template engine. It is implemented as a singleton to ensure that only one SMTP connection is maintained throughout the application lifecycle, optimizing resource usage.

(back to top)

Large Language Model

The /v1/ml/chat/ endpoint is designed to handle chat-based interactions with the LLM model. It accepts a user prompt and streams responses back in real-time. The endpoint leverages FastAPI's asynchronous capabilities to efficiently manage multiple simultaneous requests, ensuring low latency and high throughput.

FastAPI's async support is particularly beneficial for reducing I/O bottlenecks when connecting to the LLM model. By using asynchronous HTTP clients like httpx, the application can handle multiple I/O-bound tasks concurrently, such as sending requests to the LLM server and streaming responses back to the client. This approach minimizes idle time and optimizes resource utilization, making it ideal for high-performance applications.

Install ollama and run the server

ollama run llama3.2

(back to top)

UV knowledge and inspirations

(back to top)

Acknowledgments

Use this space to list resources you find helpful and would like to give credit to. I've included a few of my favorites to kick things off!

(back to top)

Change Log

2025 (3 changes)
  • [MAY 3 2025] add large language model integration πŸ€–
  • [MAR 8 2025] switch from poetry to uv ⏩
  • [JAN 28 2025] add SMTP setup πŸ“§
2024 (6 changes)
  • [DEC 16 2024] bump project to Python 3.13 ⏩
  • [OCT 16 2024] apscheduler added to project πŸ•
  • [AUG 17 2024] granian use case implemented with docker compose and rich logger ⏩
  • [JUN 8 2024] implement asyncpg connection pool ⏩
  • [MAR 15 2024] add polars and calamine to project 😻
  • [FEB 1 2024] bump project to Python 3.12 ⏩
2023 (7 changes)
  • [OCT 21 2023] refactor shakespeare models to use sqlalchemy 2.0 ⏩
  • [SEP 2 2023] add passlib and bcrypt for password hashing πŸ”’ πŸ”‘
  • [JUL 25 2023] add user authentication with JWT and Redis as token storage πŸ”’ πŸ”‘
  • [JUL 7 2023] migrate to pydantic 2.0 ⏩
  • [APR 28 2023] Rainbow logs with rich 🌈
  • [APR 10 2023] implement logging with rich
  • [FEB 14 2023] bump project to Python 3.11
2022 (5 changes)
  • [NOV 12 2022] ruff implemented to project as linting tool
  • [OCT 3 2022] poetry added to project
  • [JUN 6 2022] initial dataset for shakespeare models
  • [JUN 4 2022] alembic migrations added to project
  • [long time ago...] it was a long time ago in galaxy far far away...

(back to top)

About

Integration of FastAPI framework supported by Pydantic with SQLAlchemy ORM and PostgreSQL on asyncpg driver

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •