1-creating-a-restful-api-with-fastapi-and-postgresql-for-beginners.html

Creating a RESTful API with FastAPI and PostgreSQL for Beginners

In today's digital landscape, building efficient and scalable web applications is paramount. RESTful APIs have become the backbone of modern web services, allowing for seamless communication between different software components. FastAPI, a modern web framework for building APIs with Python, has gained popularity for its ease of use and high performance. Coupled with PostgreSQL, a powerful relational database, you can create robust applications quickly and efficiently. In this article, we’ll walk through the process of building a RESTful API using FastAPI and PostgreSQL, making it accessible even for beginners.

What is FastAPI?

FastAPI is a web framework designed to create APIs with Python. It is based on standard Python type hints, which makes it easy to write and understand. Some of its key features include:

  • Speed: FastAPI is one of the fastest Python web frameworks available, thanks to its asynchronous capabilities.
  • Easy to Use: It has a straightforward syntax that reduces the learning curve for beginners.
  • Automatic Documentation: FastAPI automatically generates interactive API documentation using Swagger UI.

What is PostgreSQL?

PostgreSQL is an advanced open-source relational database management system. It supports SQL (relational) and JSON (non-relational) querying, providing flexibility for various applications. Key features include:

  • ACID Compliance: Ensures reliable transactions.
  • Extensibility: Allows for custom functions and data types.
  • Performance: Handles large volumes of data with ease.

Setting Up Your Environment

Prerequisites

To follow along, ensure you have the following installed:

  • Python 3.7 or later
  • pip (Python package manager)
  • PostgreSQL
  • An IDE or code editor (e.g., Visual Studio Code)

Step 1: Install FastAPI and Required Packages

Open your terminal and install FastAPI and uvicorn, which serves as the ASGI server:

pip install fastapi uvicorn psycopg2-binary sqlalchemy
  • psycopg2-binary: A PostgreSQL adapter for Python.
  • SQLAlchemy: A SQL toolkit and Object-Relational Mapping (ORM) library for Python.

Step 2: Set Up PostgreSQL Database

  1. Create a Database: Log into your PostgreSQL console and create a new database.

sql CREATE DATABASE fastapi_db;

  1. Create a Table: Inside the fastapi_db, create a table to store users.

sql CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE );

Step 3: Create the FastAPI Application

Create a new directory for your project and create a file named main.py. This file will hold your FastAPI application code.

Basic Structure

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
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/fastapi_db"

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

app = FastAPI()

Step 4: Define the Database Model

Add the user model to your main.py:

class User(Base):
    __tablename__ = "users"

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

Base.metadata.create_all(bind=engine)

Step 5: Create Pydantic Models

Pydantic models help in data validation. Define a Pydantic model for user input:

class UserCreate(BaseModel):
    username: str
    email: str

Step 6: Implement CRUD Operations

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

Create User

@app.post("/users/", response_model=UserCreate)
def create_user(user: UserCreate):
    db = SessionLocal()
    db_user = User(username=user.username, email=user.email)

    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    db.close()

    return db_user

Read Users

@app.get("/users/")
def read_users(skip: int = 0, limit: int = 10):
    db = SessionLocal()
    users = db.query(User).offset(skip).limit(limit).all()
    db.close()
    return users

Update User

@app.put("/users/{user_id}")
def update_user(user_id: int, user: UserCreate):
    db = SessionLocal()
    db_user = db.query(User).filter(User.id == user_id).first()

    if not db_user:
        raise HTTPException(status_code=404, detail="User not found")

    db_user.username = user.username
    db_user.email = user.email
    db.commit()
    db.refresh(db_user)
    db.close()

    return db_user

Delete User

@app.delete("/users/{user_id}")
def delete_user(user_id: int):
    db = SessionLocal()
    db_user = db.query(User).filter(User.id == user_id).first()

    if not db_user:
        raise HTTPException(status_code=404, detail="User not found")

    db.delete(db_user)
    db.commit()
    db.close()

    return {"detail": "User deleted"}

Step 7: Run the Application

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

uvicorn main:app --reload

You can now access your API at http://127.0.0.1:8000/users/ and use the automatically generated Swagger UI at http://127.0.0.1:8000/docs.

Conclusion

Creating a RESTful API with FastAPI and PostgreSQL can be a straightforward task, even for beginners. With its powerful features, FastAPI allows developers to build APIs quickly while ensuring high performance and scalability. By following this guide, you’ve set up a basic API that can serve as a foundation for more complex applications. Now it’s time to explore more advanced features and build upon your newfound knowledge!

Takeaways

  • FastAPI is an efficient framework for creating RESTful APIs.
  • PostgreSQL is a reliable database choice for storing data.
  • Understanding CRUD operations is essential for API development.

Start experimenting with your API, add more routes, and enhance its functionality. 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.