Как создать простой API с FastAPI и базами данных за 25 минут
я покажу минимальный, но полностью рабочий пример API с двумя эндпоинтами:
- GET /items/{item_id} — получение данных
- POST /items/ — создание элемента (с валидацией)
Для хранения данных используем SQLite + Pydantic модели. Никаких сложных настроек не понадобится.
Что понадобится
- Python 3.8+
- fastapi
- uvicorn (асинхронный сервер)
- sqlalchemy (для работы с базой)
- pydantic
Установите всё одной командой:
Bash
from pydantic import BaseModel
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
description = Column(String, nullable=True)
# Создаём таблицу в памяти (SQLite)
engine = create_engine("sqlite:///./test.db", connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def init_db():
Base.metadata.create_all(bind=engine)
файл
from pydantic import BaseModel
from typing import Optional
class ItemCreate(BaseModel):
name: str
description: Optional[str] = None
class ItemResponse(ItemCreate):
id: int
class Config:
from_attributes = True
основа
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from .models import Item, SessionLocal, init_db
from .schemas import ItemCreate, ItemResponse
app = FastAPI(
title="Мой простой API",
description="Только GET и POST на SQLite",
version="1.0.0"
)
# Инициализация базы
init_db()
# Dependency для сессии
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# Эндпоинт 1: получение всех элементов
@app.get("/items/", response_model=list[ItemResponse])
async def get_items(db: Session = Depends(get_db)):
return db.query(Item).all()
# Эндпоинт 2: создание элемента
@app.post("/items/", response_model=ItemResponse)
async def create_item(item: ItemCreate, db: Session = Depends(get_db)):
db_item = Item(name=item.name, description=item.description)
db.add(db_item)
db.commit()
db.refresh(db_item)
return db_item
# Запуск
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True)
После выполнения запроса вы увидите id: 1, name: Котёнок и т.д.
Как сохранить данные
- База хранится в файле test.db в папке проекта.
- Можно легко заменить SQLite на PostgreSQL, MySQL или MongoDB за 2 минуты (просто поменяйте строку подключения).
Дополнительные улучшения (по желанию)
- Добавить аутентификацию (OAuth2 + JWT)
- Зашифровать API ключом (FastAPI поддерживает api_key)
- Перейти на PostgreSQL с Alembic для миграций
- Добавить WebSocket для реального времени
- Использовать Docker для контейнеризации
Это уже полноценный REST API, который можно сразу деплоить на Railway, Render, Fly.io или даже на свой VPS. Код получился чистым, с валидацией, автогенерируемой документацией и SQLite-хранилищем.
Начать дискуссию