Skip to content

CRUD Operations in FastAPI

CRUD (Create, Read, Update, Delete) operations are fundamental to any API. FastAPI makes implementing these operations straightforward and type-safe.

Basic CRUD Example

Here's a complete example of CRUD operations for a simple item management system:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional

app = FastAPI()

# Pydantic model for data validation
class Item(BaseModel):
    id: Optional[int] = None
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

# In-memory database
items = []
item_id_counter = 1

# Create
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    global item_id_counter
    item.id = item_id_counter
    item_id_counter += 1
    items.append(item)
    return item

# Read
@app.get("/items/", response_model=List[Item])
async def read_items():
    return items

@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int):
    for item in items:
        if item.id == item_id:
            return item
    raise HTTPException(status_code=404, detail="Item not found")

# Update
@app.put("/items/{item_id}", response_model=Item)
async def update_item(item_id: int, item: Item):
    for i, stored_item in enumerate(items):
        if stored_item.id == item_id:
            item.id = item_id
            items[i] = item
            return item
    raise HTTPException(status_code=404, detail="Item not found")

# Delete
@app.delete("/items/{item_id}")
async def delete_item(item_id: int):
    for i, item in enumerate(items):
        if item.id == item_id:
            items.pop(i)
            return {"message": "Item deleted successfully"}
    raise HTTPException(status_code=404, detail="Item not found")

Key Points

  1. Create (POST)
  2. Use @app.post() decorator
  3. Accept data in request body
  4. Validate data using Pydantic models
  5. Return created item

  6. Read (GET)

  7. Use @app.get() decorator
  8. Can return single item or list
  9. Handle not found cases

  10. Update (PUT)

  11. Use @app.put() decorator
  12. Update existing item
  13. Validate new data
  14. Return updated item

  15. Delete (DELETE)

  16. Use @app.delete() decorator
  17. Remove item from storage
  18. Return success message

Best Practices

  • Always use Pydantic models for data validation
  • Implement proper error handling
  • Use appropriate HTTP status codes
  • Consider pagination for list endpoints
  • Add proper documentation using docstrings

Next Steps