building-a-rest-api-with-fastapi-and-postgresql-integration.html

Building a REST API with FastAPI and PostgreSQL Integration

In the world of web development, creating efficient and scalable APIs is crucial. FastAPI has emerged as a leading framework for building REST APIs due to its speed, simplicity, and ease of use. When combined with PostgreSQL, a powerful relational database, developers can create robust applications that can handle a variety of data-intensive tasks. In this article, we will explore how to build a REST API using FastAPI with PostgreSQL integration.

What is FastAPI?

FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints. It’s built on top of Starlette for the web parts and Pydantic for the data parts, offering the following benefits:

  • Fast: One of the fastest Python frameworks available.
  • Easy to Use: Designed for ease of use and quick development.
  • Automatic Documentation: Generates interactive API documentation automatically using Swagger UI and ReDoc.

Why Use PostgreSQL?

PostgreSQL is an advanced open-source relational database management system. It supports both SQL (relational) and JSON (non-relational) querying. Here’s why you might choose PostgreSQL:

  • Data Integrity: Strong ACID compliance ensures data integrity.
  • Complex Queries: Supports advanced queries and indexing options.
  • Scalability: Can handle large volumes of data efficiently.

Setting Up Your Environment

Before we begin coding our REST API, let’s set up our environment. Ensure you have Python 3.6+ installed, along with the following packages:

pip install fastapi[all] psycopg2-binary sqlalchemy uvicorn
  • FastAPI: The web framework.
  • Psycopg2: PostgreSQL adapter for Python.
  • SQLAlchemy: ORM for database interactions.
  • Uvicorn: ASGI server for running our FastAPI app.

Step-by-Step Guide to Building the API

Step 1: Create a Project Structure

Organize your project directory as follows:

/fastapi_postgres_api
    ├── app
    │   ├── main.py
    │   ├── models.py
    │   ├── schemas.py
    │   └── database.py
    └── requirements.txt

Step 2: Database Configuration

In database.py, set up the connection to your PostgreSQL database.

# app/database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

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

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

Step 3: Define Models

Create a model in models.py using SQLAlchemy.

# 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 4: Create Pydantic Schemas

Define schemas for request and response validation in schemas.py.

# app/schemas.py
from pydantic import BaseModel

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

class ItemCreate(ItemBase):
    pass

class Item(ItemBase):
    id: int

    class Config:
        orm_mode = True

Step 5: CRUD Operations

Implement the CRUD operations in main.py.

# app/main.py
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from . import models, schemas
from .database import SessionLocal, engine

# Create the database tables
models.Base.metadata.create_all(bind=engine)

app = FastAPI()

# Dependency to get the database session
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 6: Run Your Application

To start your FastAPI application, run the following command in your terminal:

uvicorn app.main:app --reload

Visit http://127.0.0.1:8000/docs to see your automatically generated API documentation, where you can test your endpoints.

Conclusion

Building a REST API with FastAPI and PostgreSQL integration can be done efficiently and effectively. FastAPI's intuitive design and PostgreSQL's powerful capabilities provide a solid foundation for any web application. By following the steps outlined in this guide, you can set up your API quickly and focus on developing features that matter to your users.

Remember, as you expand your application, consider implementing features like authentication, logging, and error-handling to make your API production-ready. 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.