1-creating-restful-apis-using-fastapi-with-postgresql.html

Creating RESTful APIs using FastAPI with PostgreSQL

In the evolving landscape of web development, creating efficient and scalable RESTful APIs has become essential for modern applications. FastAPI, a high-performance web framework for building APIs with Python, is an excellent choice for developers looking to create RESTful services quickly and effectively. When paired with PostgreSQL, a powerful relational database, developers can build robust applications that leverage the best of both worlds. In this article, we will explore how to create a RESTful API using FastAPI with PostgreSQL, covering definitions, use cases, and actionable insights.

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. Its primary features include:

  • Fast: Very high performance, on par with Node.js and Go (thanks to Starlette and Pydantic).
  • Easy: Designed to be easy to use and learn, with automatic generation of OpenAPI documentation.
  • Robust: Built-in support for data validation, serialization, and documentation.

What is PostgreSQL?

PostgreSQL is an advanced, open-source relational database management system known for its robustness, scalability, and support for complex queries. It is widely used in enterprise applications and is particularly well-suited for applications requiring complex transactions.

Use Cases for FastAPI and PostgreSQL

FastAPI and PostgreSQL are ideal for various applications, including:

  • Web APIs: For serving data to frontend applications.
  • Microservices: Creating lightweight, independent services that communicate via APIs.
  • Data-driven applications: Applications that require dynamic data handling and complex transactions.
  • Real-time applications: FastAPI’s asynchronous capabilities make it suitable for applications needing real-time data processing.

Getting Started with FastAPI and PostgreSQL

Prerequisites

Before we dive into coding, ensure you have the following installed:

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

Step 1: Setting Up Your Environment

First, create a new directory for your project and set up a virtual environment:

mkdir fastapi-postgresql
cd fastapi-postgresql
python -m venv venv
source venv/bin/activate  # On Windows use `venv\Scripts\activate`

Now, install FastAPI and the required packages:

pip install fastapi[all] psycopg2-binary

Step 2: Setting Up PostgreSQL

  1. Create a PostgreSQL Database:

Open your PostgreSQL command line interface and create a new database:

CREATE DATABASE fastapi_db;
  1. Create a User:

Create a user and grant them access to your database:

CREATE USER fastapi_user WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE fastapi_db TO fastapi_user;

Step 3: Building Your FastAPI Application

Create a new file named main.py in your project directory. This is where we will define our FastAPI application.

Basic Application Structure

Here’s a simple structure for your FastAPI application:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import asyncpg

app = FastAPI()

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

class Item(BaseModel):
    id: int
    name: str
    description: str

@app.on_event("startup")
async def startup():
    app.state.db = await asyncpg.connect(DATABASE_URL)

@app.on_event("shutdown")
async def shutdown():
    await app.state.db.close()

Step 4: CRUD Operations

Now, let’s implement the basic CRUD (Create, Read, Update, Delete) operations.

Create an Item

@app.post("/items/")
async def create_item(item: Item):
    query = "INSERT INTO items(id, name, description) VALUES($1, $2, $3)"
    await app.state.db.execute(query, item.id, item.name, item.description)
    return item

Read Items

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    query = "SELECT * FROM items WHERE id = $1"
    item = await app.state.db.fetchrow(query, item_id)
    if item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    return item

Update an Item

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    query = "UPDATE items SET name = $1, description = $2 WHERE id = $3"
    await app.state.db.execute(query, item.name, item.description, item_id)
    return item

Delete an Item

@app.delete("/items/{item_id}")
async def delete_item(item_id: int):
    query = "DELETE FROM items WHERE id = $1"
    await app.state.db.execute(query, item_id)
    return {"message": "Item deleted successfully"}

Step 5: Running Your 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 automatically generated API documentation.

Conclusion

Creating RESTful APIs using FastAPI with PostgreSQL can significantly streamline your development process. By leveraging FastAPI’s asynchronous capabilities and PostgreSQL’s robust data management features, you can build efficient and scalable web applications. With this guide, you've learned the basics of setting up a FastAPI application, performing CRUD operations, and managing your PostgreSQL database.

Start building your next project today, and unlock the power of FastAPI with 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.