2-how-to-create-scalable-apis-with-fastapi-and-postgresql.html

How to Create Scalable APIs with FastAPI and PostgreSQL

In today's digital landscape, building scalable APIs is crucial for any developer looking to create robust applications. FastAPI, a modern web framework for Python, combined with PostgreSQL, a powerful relational database, provides an excellent foundation for developing high-performance APIs. This article will guide you through the process of creating scalable APIs using FastAPI and PostgreSQL, covering definitions, use cases, and practical coding examples.

What is FastAPI?

FastAPI is a web framework designed for building APIs with Python 3.6+ based on standard Python type hints. It's recognized for its high performance, ease of use, and automatic generation of interactive API documentation. FastAPI leverages Starlette for the web parts and Pydantic for the data parts, making it a powerful tool for developers looking to create APIs quickly and efficiently.

Key Features of FastAPI:

  • Fast: High performance, on par with Node.js and Go.
  • Easy to Use: Simple and intuitive syntax that makes writing code easier.
  • Automatic Documentation: Generates interactive API documentation using Swagger UI and ReDoc.
  • Type Hints: Leverages Python’s type hints for data validation and serialization.

What is PostgreSQL?

PostgreSQL is an advanced open-source relational database known for its robustness, scalability, and SQL compliance. It supports advanced data types and performance optimization features, making it a go-to choice for many developers when building applications requiring complex data handling.

Key Features of PostgreSQL:

  • Extensibility: Allows for custom functions, operators, and data types.
  • Complex Queries: Supports advanced SQL queries, making it suitable for complex analytics.
  • High Availability: Features such as replication and clustering ensure data availability.
  • Security: Offers strong authentication and access control mechanisms.

Use Cases for FastAPI and PostgreSQL

  1. Microservices: FastAPI is perfect for building microservices that require quick responses and low latency.
  2. Data-Driven Applications: Applications that need to handle large datasets benefit from PostgreSQL's capabilities.
  3. Real-Time Applications: FastAPI's asynchronous capabilities make it suitable for applications requiring real-time data processing.

Setting Up Your Development Environment

Prerequisites

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

  • Python 3.6+
  • PostgreSQL
  • pip (Python package installer)

Step 1: Install Required Packages

Start by installing FastAPI and an ASGI server, such as uvicorn, and a PostgreSQL adapter for Python, asyncpg, using pip:

pip install fastapi uvicorn asyncpg sqlalchemy

Building Your First API with FastAPI and PostgreSQL

Step 2: Setting Up PostgreSQL

  1. Create a Database: Open your PostgreSQL command line or pgAdmin and create a database.
CREATE DATABASE fastapi_db;
  1. Create a Table: Define a simple table to store user data.
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100) UNIQUE NOT NULL
);

Step 3: Create the FastAPI Application

Now, let’s create a new Python file, main.py, to set up the FastAPI application.

from fastapi import FastAPI, HTTPException
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "postgresql+asyncpg://user:password@localhost/fastapi_db"

app = FastAPI()
Base = declarative_base()
engine = create_engine(DATABASE_URL)

class User(Base):
    __tablename__ = 'users'

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

Base.metadata.create_all(bind=engine)

Step 4: Implement CRUD Operations

Now, let’s implement the Create, Read, Update, and Delete (CRUD) operations.

Create a User

from fastapi import Depends
from sqlalchemy.orm import Session

# Dependency to get DB session
def get_db():
    db = sessionmaker(bind=engine)()
    try:
        yield db
    finally:
        db.close()

@app.post("/users/", response_model=User)
async def create_user(user: User, db: Session = Depends(get_db)):
    db.add(user)
    db.commit()
    db.refresh(user)
    return user

Read Users

@app.get("/users/{user_id}", response_model=User)
async def read_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

Update a User

@app.put("/users/{user_id}", response_model=User)
async def update_user(user_id: int, user: User, db: Session = Depends(get_db)):
    db_user = db.query(User).filter(User.id == user_id).first()
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")

    db_user.name = user.name
    db_user.email = user.email
    db.commit()
    db.refresh(db_user)
    return db_user

Delete a User

@app.delete("/users/{user_id}")
async def delete_user(user_id: int, db: Session = Depends(get_db)):
    db_user = db.query(User).filter(User.id == user_id).first()
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")

    db.delete(db_user)
    db.commit()
    return {"detail": "User deleted"}

Step 5: Run the Application

To run your FastAPI application, use the following command:

uvicorn main:app --reload

Your API will now be live at http://127.0.0.1:8000, and you can access the interactive API documentation at http://127.0.0.1:8000/docs.

Conclusion

Creating scalable APIs with FastAPI and PostgreSQL is not only efficient but also enjoyable. FastAPI’s simplicity and PostgreSQL’s robustness make them an ideal duo for modern application development. With the step-by-step guide provided, you can easily implement a scalable API that can grow alongside your application needs. As you progress, consider exploring more advanced features of FastAPI, such as background tasks and dependency injection, to further optimize and enhance your API. 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.