1-creating-restful-apis-with-fastapi-and-postgresql-database.html

Creating RESTful APIs with FastAPI and PostgreSQL Database

In today's digital landscape, building efficient and scalable web applications is paramount. One of the most effective ways to achieve this is by creating RESTful APIs. FastAPI, a modern Python web framework, paired with PostgreSQL, a robust relational database, offers developers a powerful toolkit for crafting high-performance APIs. In this article, we'll explore what RESTful APIs are, why FastAPI and PostgreSQL are excellent choices, and how to create a simple RESTful API step by step.

What is a RESTful API?

REST (Representational State Transfer) is an architectural style that defines a set of constraints and properties based on HTTP. A RESTful API is an interface that allows different software applications to communicate over the internet using standard HTTP methods such as GET, POST, PUT, and DELETE.

Key Features of RESTful APIs:

  • Stateless: Each API request from the client contains all the information needed to process the request.
  • Resource-Based: Resources are identified by URIs (Uniform Resource Identifiers) and are represented in formats like JSON or XML.
  • Standard Methods: CRUD operations are mapped to standard HTTP methods:
  • GET: Retrieve data
  • POST: Create new data
  • PUT: Update existing data
  • DELETE: Remove data

Why Choose FastAPI and PostgreSQL?

FastAPI

FastAPI is a modern web framework for building APIs with Python 3.6+ based on standard Python type hints. It's designed for speed and ease of use, making it an ideal choice for developing RESTful APIs.

Benefits of FastAPI:

  • High Performance: FastAPI is one of the fastest Python frameworks available due to its asynchronous capabilities.
  • Automatic Documentation: It generates interactive API documentation using Swagger UI and ReDoc.
  • Easy to Use: Its intuitive design allows developers to write clean and maintainable code.

PostgreSQL

PostgreSQL is an open-source relational database known for its advanced features and reliability. It’s a popular choice for applications requiring complex queries and transactions.

Benefits of PostgreSQL:

  • ACID Compliance: Ensures data integrity and reliability.
  • Rich Data Types: Supports a variety of data types, including JSON and arrays.
  • Extensibility: You can define custom functions and operators.

Setting Up the Environment

To get started, ensure you have Python and PostgreSQL installed on your machine. You’ll also need to install FastAPI and an ASGI server like Uvicorn. Follow these steps:

  1. Install Python: Download and install Python from python.org.

  2. Install PostgreSQL: Download and install PostgreSQL from postgresql.org.

  3. Set up a virtual environment: bash python -m venv myenv source myenv/bin/activate # On Windows use `myenv\Scripts\activate`

  4. Install FastAPI and Uvicorn: bash pip install fastapi uvicorn psycopg2-binary

  5. Install SQLAlchemy (for ORM): bash pip install sqlalchemy

Creating a Simple RESTful API

Now that the environment is ready, let’s create a simple RESTful API for managing a list of items. We will use SQLAlchemy as an ORM to interact with the PostgreSQL database.

Step 1: Database Configuration

Create a file named database.py for database configuration.

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

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

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

Step 2: Define the Item Model

Next, create a model for the items we want to manage. Create a file named 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)

Step 3: Create the CRUD Operations

Now, let’s define the CRUD operations in a file named crud.py.

from sqlalchemy.orm import Session
from . import models

def get_item(db: Session, item_id: int):
    return db.query(models.Item).filter(models.Item.id == item_id).first()

def create_item(db: Session, name: str, description: str):
    db_item = models.Item(name=name, description=description)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

Step 4: Set Up FastAPI Routes

Now, let’s create the FastAPI application in a file named main.py.

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

app = FastAPI()

# Dependency to get DB session
def get_db():
    db = database.SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/items/", response_model=models.Item)
def create_item(name: str, description: str, db: Session = Depends(get_db)):
    return crud.create_item(db=db, name=name, description=description)

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

Step 5: Run the Application

To run your FastAPI application, use the following command:

uvicorn main:app --reload

Visit http://127.0.0.1:8000/docs to see the interactive API documentation generated by FastAPI.

Conclusion

Creating RESTful APIs with FastAPI and PostgreSQL is a powerful way to build scalable web applications. FastAPI’s speed and ease of use, combined with PostgreSQL’s reliability, offer a robust solution for developers. By following the steps outlined in this article, you can set up your own API quickly and efficiently.

Actionable Insights:

  • Always validate input data to ensure data integrity.
  • Utilize FastAPI’s dependency injection to manage database sessions effectively.
  • Explore SQLAlchemy's capabilities to leverage more complex queries and relationships.

With this knowledge, you're now equipped to create your own RESTful APIs using FastAPI and PostgreSQL. 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.