How to Set Up a Fast API Application with a NoSQL Database

How to Set Up a Fast API Application with a NoSQL Database

Setting up a FastAPI application with a NoSQL database enables developers to create efficient, fast, and scalable APIs, leveraging the speed and asynchronous capabilities of FastAPI.

By Snow Dream Studios
Home   /Blog  /Technical  /How to Set Up a Fast API Application with a NoSQL Database

Setting up a FastAPI application with a NoSQL database enables developers to create efficient, fast, and scalable APIs, leveraging the speed and asynchronous capabilities of FastAPI and the flexible data handling provided by NoSQL databases. This guide walks through the complete setup process, covering necessary installations, configuration, and integration steps to build a reliable FastAPI application with a NoSQL backend.

Process 1: Understanding FastAPI and NoSQL Databases

What is FastAPI?

FastAPI is a modern, high-performance web framework for Python, optimized for building APIs. Its asynchronous capabilities enable it to handle multiple tasks simultaneously, which is critical for API efficiency and speed.

 

Why Use a NoSQL Database?

Unlike traditional SQL databases, NoSQL databases are schema-less, offering more flexibility for storing data. They are ideal for handling large-scale applications with dynamic data needs, making them a good match for modern web frameworks like FastAPI.

  

Process 2: Setting Up the Development Environment

Before diving into the FastAPI and NoSQL setup, it’s essential to prepare your development environment.

Step 1: Install Python and Create a Virtual Environment

  1. Install Python (version 3.7 or above is recommended) from the official Python website.
  2. Create a virtual environment to manage dependencies for your FastAPI project:
   python3 -m venv fastapi_env
   source fastapi_env/bin/activate

Step 2: Install FastAPI and Uvicorn

FastAPI requires Uvicorn, an ASGI server that can run asynchronous applications:

   pip install fastapi uvicorn

Process 3: Installing and Configuring a NoSQL Database

Choosing a NoSQL Database

Some popular NoSQL options that work well with FastAPI include MongoDB, Cassandra, CouchDB, and Redis.

MongoDB is widely used with FastAPI due to its compatibility with Python and strong support for asynchronous operations.

Following these setup steps will help you create a solid foundation for API development and real-world application needs.

Step 1: Install MongoDB

  1. Download and install MongoDB from the MongoDB website or using package managers like apt for Ubuntu:
   sudo apt update
   sudo apt install -y mongodb
  1. Start the MongoDB server:
   sudo systemctl start mongodb
   sudo systemctl enable mongodb

Step 2: Install the Motor Library

FastAPI can interact with MongoDB using the Motor library, an asynchronous driver for MongoDB.

   pip install motor

Process 4: Creating the FastAPI Application

With MongoDB set up, you can start building the FastAPI application.

Step 1: Initialize the FastAPI App

In your project directory, create a new file, main.py, and initialize FastAPI:

   from fastapi import FastAPI

   app = FastAPI()

   @app.get("/")
   async def root():
       return {"message": "Hello, FastAPI with MongoDB!"}

Step 2: Define Database Connection

In main.py, import the Motor client to connect to MongoDB, and define the connection string. Here’s a basic example:

   from motor.motor_asyncio import AsyncIOMotorClient

   client = AsyncIOMotorClient("mongodb://localhost:27017")
   db = client["mydatabase"]

This establishes a connection to the local MongoDB server and selects the mydatabase database.

Process 5: Creating Data Models with Pydantic

FastAPI relies on Pydantic models for data validation, which is helpful for structuring data sent to and from the API.

Step 1: Define a Pydantic Model

Create a new file, models.py, and define a Pydantic model for MongoDB documents. This example creates a simple model for a user with a name and email:

   from pydantic import BaseModel

   class UserModel(BaseModel):
       name: str
       email: str

Step 2: Define MongoDB Document Model

MongoDB uses ObjectId as the document identifier, which requires a slightly different setup for Pydantic. Modify models.py to include this:

   from bson import ObjectId
   from pydantic import BaseModel, Field

   class UserModel(BaseModel):
       id: str = Field(default_factory=ObjectId, alias="_id")
       name: str
       email: str

Process 6: Building CRUD Endpoints in FastAPI

CRUD operations (Create, Read, Update, Delete) form the core of most APIs. Here’s how to implement these with FastAPI and MongoDB.

Step 1: Create a User

In main.py, define the endpoint to add a new user to MongoDB:

   @app.post("/users/")
   async def create_user(user: UserModel):
       user_dict = user.dict(by_alias=True)
       await db["users"].insert_one(user_dict)
       return user_dict

Step 2: Read Users

To retrieve users, add a GET endpoint:

   @app.get("/users/")
   async def get_users():
       users = await db["users"].find().to_list(100)
       return users

Step 3: Update a User

The PUT endpoint allows updates to user details:

   from fastapi import HTTPException

   @app.put("/users/{user_id}")
   async def update_user(user_id: str, user: UserModel):
       update_result = await db["users"].update_one({"_id": ObjectId(user_id)}, {"$set": user.dict(by_alias=True)})
       if update_result.matched_count == 0:
           raise HTTPException(status_code=404, detail="User not found")
       return {"status": "updated"}

Step 4: Delete a User

Define the DELETE endpoint to remove a user:

   @app.delete("/users/{user_id}")
   async def delete_user(user_id: str):
       delete_result = await db["users"].delete_one({"_id": ObjectId(user_id)})
       if delete_result.deleted_count == 0:
           raise HTTPException(status_code=404, detail="User not found")
       return {"status": "deleted"}

Process 7: Testing and Running the FastAPI Application

Step 1: Running FastAPI with Uvicorn

To test the setup, run the FastAPI application with Uvicorn:

   uvicorn main:app --reload

Visit http://127.0.0.1:8000/docs in your browser to see the interactive API documentation generated by FastAPI. This interface allows you to test each endpoint with example data.

Step 2: Testing Endpoints

Use tools like Postman or FastAPI's Swagger UI to test CRUD endpoints, ensuring they correctly interact with MongoDB.

8. Optional: Running FastAPI and MongoDB with Docker

For a more flexible deployment, Docker can be used to run both FastAPI and MongoDB in containers.

Step 1: Create Docker Files

  1. Dockerfile for FastAPI:
   FROM python:3.9
   WORKDIR /app
   COPY . /app
   RUN pip install fastapi uvicorn motor
   CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
  1. docker-compose.yml for MongoDB and FastAPI:
   version: "3"
   services:
     web:
       build: .
       ports:
         - "8000:8000"
     db:
       image: mongo
       ports:
         - "27017:27017"

Step 2: Run Docker Compose

Run the containers using:

   docker-compose up

This setup creates a containerized environment for FastAPI and MongoDB, simplifying deployment.

Conclusion

Setting up a FastAPI application with a NoSQL database, like MongoDB, creates a robust and flexible platform for handling dynamic data. FastAPI’s asynchronous capabilities, combined with the flexible data structures of NoSQL databases, allow developers to create fast, efficient, and scalable applications suitable for modern web services.