building-restful-apis-with-fastapi-and-postgresql-using-sqlalchemy.html

Building RESTful APIs with FastAPI and PostgreSQL Using SQLAlchemy

In the modern world of web development, the demand for robust, efficient, and scalable APIs has never been higher. Among the various frameworks available, FastAPI has emerged as a popular choice due to its speed, ease of use, and support for asynchronous programming. When coupled with PostgreSQL—a powerful relational database—and SQLAlchemy, a leading ORM (Object-Relational Mapping) tool, you can create high-performing RESTful APIs that meet the demands of today’s applications. This article will walk you through the process of building RESTful APIs using FastAPI and PostgreSQL, with a focus on practical coding examples and best practices.

What is FastAPI?

FastAPI is a modern, fast (high-performance) web framework for building APIs with Python 3.7+ based on standard Python type hints. Its features include:

  • Fast: Very high performance, on par with NodeJS and Go (thanks to Starlette and Pydantic).
  • Easy: Designed to be easy to use and learn, making it great for beginners and experienced developers alike.
  • Automatic documentation: Interactive API documentation is generated automatically using OpenAPI.

What is PostgreSQL?

PostgreSQL is a powerful, open-source object-relational database system known for its robustness, extensibility, and performance. It supports advanced data types and is highly customizable, making it suitable for a wide range of applications.

What is SQLAlchemy?

SQLAlchemy is an SQL toolkit and ORM for Python. It provides a full suite of well-known enterprise-level persistence patterns, designed for efficient and high-performing database access. With SQLAlchemy, you can interact with your database using Python code instead of SQL queries, making your code cleaner and easier to manage.

Setting Up Your Environment

Prerequisites

Before we dive into the code, ensure you have the following installed:

  • Python 3.7 or higher
  • PostgreSQL
  • pip (Python package installer)

Installation

  1. Create a virtual environment (optional but recommended): bash python -m venv env source env/bin/activate # On Windows use `env\Scripts\activate`

  2. Install FastAPI, SQLAlchemy, and the PostgreSQL driver: bash pip install fastapi[all] sqlalchemy psycopg2

Setting Up the PostgreSQL Database

  1. Create a PostgreSQL database: Open your PostgreSQL command line or use a GUI tool like pgAdmin: sql CREATE DATABASE fastapi_db;

  2. Create a User (optional): sql CREATE USER fastapi_user WITH ENCRYPTED PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE fastapi_db TO fastapi_user;

Creating the FastAPI Application

Project Structure

Create a project folder and set up the following structure:

/fastapi_postgresql
│
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── models.py
│   ├── schemas.py
│   └── database.py

Step 1: Database Configuration

In app/database.py, configure your database connection:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "postgresql://fastapi_user:your_password@localhost/fastapi_db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

Step 2: Create Models

Define your database models in app/models.py:

from sqlalchemy import Column, Integer, String
from .database import Base

class Item(Base):
    __tablename__ = "items"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    description = Column(String, index=True)

Step 3: Create Schemas

In app/schemas.py, define Pydantic schemas for request validation:

from pydantic import BaseModel

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

class Item(ItemCreate):
    id: int

    class Config:
        orm_mode = True

Step 4: Create CRUD Operations

In app/main.py, set up your FastAPI application and define CRUD operations:

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from . import models, schemas
from .database import SessionLocal, engine

models.Base.metadata.create_all(bind=engine)

app = FastAPI()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/items/", response_model=schemas.Item)
def create_item(item: schemas.ItemCreate, db: Session = Depends(get_db)):
    db_item = models.Item(name=item.name, description=item.description)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

@app.get("/items/{item_id}", response_model=schemas.Item)
def read_item(item_id: int, db: Session = Depends(get_db)):
    db_item = db.query(models.Item).filter(models.Item.id == item_id).first()
    if db_item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    return db_item

Step 5: Run Your FastAPI Application

To run your FastAPI application, execute the following command:

uvicorn app.main:app --reload

Visit http://127.0.0.1:8000/docs to access the automatically generated interactive API documentation.

Conclusion

Building RESTful APIs with FastAPI, PostgreSQL, and SQLAlchemy allows you to create scalable and efficient applications with ease. With FastAPI’s high performance, SQLAlchemy’s powerful ORM capabilities, and PostgreSQL’s robust database features, you have all the tools you need to develop modern web applications.

Key Takeaways

  • FastAPI is ideal for building APIs quickly and efficiently.
  • PostgreSQL provides a reliable database solution.
  • SQLAlchemy simplifies database interactions with its ORM capabilities.

By following the steps outlined in this article, you can create your own RESTful API while gaining valuable insights into API development best practices. Happy coding!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.