4-how-to-create-restful-apis-with-fastapi-and-postgresql.html

How to Create RESTful APIs with FastAPI and PostgreSQL

In today's digital landscape, building efficient and scalable web applications often requires robust APIs. FastAPI, a modern web framework for Python, simplifies the creation of RESTful APIs, while PostgreSQL provides a powerful relational database management system. In this article, we will dive deep into creating a RESTful API using FastAPI and PostgreSQL, covering everything from setup to deployment.

What is a RESTful API?

A RESTful API (Representational State Transfer API) is an architectural style used for designing networked applications. It relies on stateless communication and standard HTTP methods, making it easy to create scalable and maintainable web services. Key principles of REST include:

  • Statelessness: Each API call contains all the information necessary to fulfill the request.
  • Resource-based: Resources are identified by URIs and can be manipulated using standard HTTP methods (GET, POST, PUT, DELETE).
  • JSON Format: Data is typically exchanged in JSON format, which is lightweight and easy to work with.

Why Choose FastAPI?

FastAPI is a modern, high-performance web framework for building APIs with Python 3.6+ based on standard Python type hints. Here are some of its standout features:

  • Speed: Built on Starlette for the web parts and Pydantic for the data parts, FastAPI is one of the fastest frameworks available.
  • Automatic Documentation: FastAPI automatically generates interactive API documentation using Swagger UI and ReDoc.
  • Easy to Use: With clear syntax and type hints, FastAPI reduces the amount of boilerplate code, making it easier to develop and maintain APIs.

Setting Up Your Development Environment

Prerequisites

Before we begin, ensure you have the following installed:

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

Install Required Packages

You can install FastAPI and the necessary database drivers using pip. Run the following command in your terminal:

pip install fastapi[all] psycopg2-binary
  • fastapi[all] installs FastAPI along with its optional dependencies.
  • psycopg2-binary is a PostgreSQL adapter for Python.

Creating Your First FastAPI Application

Step 1: Create the FastAPI Application

Create a new directory for your project and navigate into it. Inside, create a file named main.py:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

Step 2: Run the Application

Run the FastAPI application using Uvicorn, an ASGI server for Python:

uvicorn main:app --reload

Visit http://127.0.0.1:8000/docs in your browser to access the interactive API documentation.

Step 3: Connect to PostgreSQL

To connect FastAPI to PostgreSQL, we'll use SQLAlchemy as the ORM (Object Relational Mapper). Create a new file named database.py in your project directory:

from sqlalchemy import create_engine, Column, Integer, String
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()

Make sure to replace username, password, and dbname with your PostgreSQL credentials.

Step 4: Define Your Data Model

In database.py, define a model for your resource. For example, let's create a simple Item model:

class Item(Base):
    __tablename__ = "items"

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

Step 5: Create the Database Tables

Run the following code to create the database tables using SQLAlchemy:

Base.metadata.create_all(bind=engine)

Step 6: Implement CRUD Operations

Now, let's implement the Create, Read, Update, and Delete (CRUD) operations in main.py:

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

app = FastAPI()

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

@app.post("/items/")
def create_item(item: Item, db: Session = Depends(get_db)):
    db.add(item)
    db.commit()
    db.refresh(item)
    return item

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

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item, db: Session = Depends(get_db)):
    db_item = db.query(Item).filter(Item.id == item_id).first()
    if db_item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    db_item.name = item.name
    db_item.description = item.description
    db.commit()
    return db_item

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

Step 7: Test Your API

You can now test your API using the interactive documentation at http://127.0.0.1:8000/docs. Use the various endpoints to create, read, update, and delete items in your PostgreSQL database.

Conclusion

Creating RESTful APIs with FastAPI and PostgreSQL is a straightforward process that combines the power of a modern web framework with a robust database management system. By following the steps outlined in this article, you can build a fully functional API capable of handling CRUD operations efficiently.

FastAPI not only enhances your development speed but also offers an array of features that make it a top choice for developers. Whether you’re building a small application or a complex system, this combination of tools will serve you well. 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.