how-to-build-a-restful-api-with-fastapi-and-postgresql.html

How to Build a RESTful API with FastAPI and PostgreSQL

In today's digital landscape, building robust and efficient APIs is essential for modern web applications. FastAPI is a cutting-edge web framework for building APIs with Python, and when combined with PostgreSQL, a powerful relational database, you can create a high-performance, scalable backend. In this article, we’ll walk through the steps to build a RESTful API using FastAPI and PostgreSQL, complete with code snippets and practical insights.

What is FastAPI?

FastAPI is an asynchronous web framework that allows you to create APIs quickly and efficiently. It is built on top of Starlette for the web parts and Pydantic for the data parts. FastAPI is known for its speed, automatic generation of OpenAPI documentation, and type checking, making it an excellent choice for both new and experienced developers.

Key Features of FastAPI:

  • Fast Performance: Thanks to asynchronous capabilities.
  • Easy to Use: Intuitive syntax and automatic data validation.
  • Built-in Documentation: Automatically generated Swagger UI and ReDoc.
  • Highly Scalable: Ideal for microservices architecture.

What is PostgreSQL?

PostgreSQL is a powerful, open-source relational database system known for its robustness and performance. It supports advanced data types and offers rich functionalities like transactions, concurrency, and data integrity.

Use Cases for FastAPI and PostgreSQL

  • Web Applications: Backend for dynamic websites.
  • Microservices: Handling specific functionalities in a distributed system.
  • Data-Driven Applications: Real-time data processing and analytics.

Setting Up Your Development Environment

Before we dive into coding, let's set up our environment.

Prerequisites

  • Python 3.7 or later: Make sure you have Python installed. You can download it from the official Python website.
  • PostgreSQL: Install PostgreSQL and set up a database. You can find installation instructions on the PostgreSQL official site.
  • FastAPI: Install FastAPI and an ASGI server, like uvicorn.
  • SQLAlchemy: This ORM will help us interact with our PostgreSQL database.

Installation

To get started, create a new directory for your project and install the required packages:

mkdir fastapi_postgresql_api
cd fastapi_postgresql_api
python -m venv venv
source venv/bin/activate  # On Windows use `venv\Scripts\activate`
pip install fastapi uvicorn sqlalchemy psycopg2

Building the RESTful API

Step 1: Setting Up the Database

First, let's create a PostgreSQL database. You can do this using the PostgreSQL command line or a GUI tool like pgAdmin. For this example, we'll create a database called fastapi_db.

CREATE DATABASE fastapi_db;

Step 2: Creating the Database Model

Next, create a file named models.py to define your database models. Here, we’ll create a simple model for a User.

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

class User(Base):
    __tablename__ = 'users'

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

Step 3: Setting Up Database Connection

Create a database.py file to set up the connection to PostgreSQL using SQLAlchemy.

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

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

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

Step 4: Creating CRUD Operations

In a new file called crud.py, define the CRUD operations for your User model.

from sqlalchemy.orm import Session
from models import User

def create_user(db: Session, username: str, email: str):
    db_user = User(username=username, email=email)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

def get_user(db: Session, user_id: int):
    return db.query(User).filter(User.id == user_id).first()

Step 5: Building the API Endpoints

Now, let's create the main application in main.py.

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

Base.metadata.create_all(bind=engine)

app = FastAPI()

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

@app.post("/users/")
def create_user(username: str, email: str, db: Session = Depends(get_db)):
    return crud.create_user(db=db, username=username, email=email)

@app.get("/users/{user_id}")
def read_user(user_id: int, db: Session = Depends(get_db)):
    db_user = crud.get_user(db=db, user_id=user_id)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

Step 6: Running the Application

To run your FastAPI application, use the following command:

uvicorn main:app --reload

You can access the automatically generated documentation at http://127.0.0.1:8000/docs.

Conclusion

Building a RESTful API with FastAPI and PostgreSQL is a straightforward process that allows you to leverage the speed and efficiency of both technologies. By following the steps outlined in this article, you’ve set up a basic API that can be extended further with additional features like authentication, more complex queries, and data validation.

Key Takeaways:

  • FastAPI provides a fast, easy-to-use framework for API development.
  • PostgreSQL offers powerful data management capabilities.
  • The combination is perfect for building scalable and maintainable web applications.

Now that you have a foundational understanding, you can explore more advanced features and optimizations to 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.