← Назад к вопросам

Какие БД можно использовать в FastAPI?

1.0 Junior🔥 151 комментариев
#Django#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Использование баз данных в FastAPI

FastAPI — это фреймворк для создания API, он агностичен к БД. Ты можешь использовать любую БД, которая имеет Python драйвер. Выбор зависит от требований проекта.

Реляционные БД (SQL)

PostgreSQL (рекомендуется)

# requirements.txt
fastapi==0.104.1
sqlalchemy==2.0.23
psycopg[binary]==3.17
alembic==1.12.1

# models.py
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime, timezone

# Подключение к PostgreSQL
DATABASE_URL = "postgresql://user:password@localhost:5432/dbname"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer, primary_key=True, index=True)
    email = Column(String, unique=True, index=True)
    is_active = Column(Boolean, default=True)
    created_at = Column(DateTime(timezone=True), default=datetime.now(timezone.utc))

# main.py
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from typing import List

app = FastAPI()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/users")
async def create_user(email: str, db: Session = Depends(get_db)):
    user = User(email=email)
    db.add(user)
    db.commit()
    db.refresh(user)
    return user

@app.get("/users")
async def list_users(db: Session = Depends(get_db)):
    return db.query(User).all()

MySQL / MariaDB

# requirements.txt
mysqlclient==2.2.0
# или
mysql-connector-python==8.2.0
# или (рекомендуется)
pymysql==1.1.0

# Подключение
DATABASE_URL = "mysql+pymysql://user:password@localhost:3306/dbname"
engine = create_engine(DATABASE_URL)

SQLite (для разработки)

# Идеально для локальной разработки и тестирования
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(
    DATABASE_URL,
    connect_args={"check_same_thread": False}  # Нужно для SQLite
)

NoSQL БД

MongoDB

# requirements.txt
motorengine==2.2.4  # Асинхронный драйвер
pydantic==2.0.0

# models.py
from pydantic import BaseModel
from motorengine import Document, StringField, IntField, DateTimeField
from datetime import datetime, timezone

class User(Document):
    email = StringField(required=True)
    age = IntField()
    created_at = DateTimeField(default=datetime.now(timezone.utc))

# main.py
from fastapi import FastAPI
from motorengine import connect

app = FastAPI()

@app.on_event("startup")
async def startup():
    await connect("mongodb://localhost:27017/dbname")

@app.post("/users")
async def create_user(email: str):
    user = User(email=email)
    await user.save()
    return user

@app.get("/users")
async def list_users():
    return await User.objects.all()

Redis (кэш и очереди)

# requirements.txt
redis==5.0.0

# main.py
from fastapi import FastAPI
import redis.asyncio as redis
import json

app = FastAPI()
redis_client = None

@app.on_event("startup")
async def startup():
    global redis_client
    redis_client = await redis.from_url("redis://localhost")

@app.post("/cache")
async def set_cache(key: str, value: str):
    await redis_client.set(key, value, ex=3600)  # 1 час
    return {"status": "ok"}

@app.get("/cache/{key}")
async def get_cache(key: str):
    value = await redis_client.get(key)
    return {"value": value.decode() if value else None}

Облачные БД

Firebase (Google)

# requirements.txt
firebase-admin==6.3.0

# main.py
from fastapi import FastAPI
import firebase_admin
from firebase_admin import credentials, db

cred = credentials.Certificate("serviceAccountKey.json")
firebase_admin.initialize_app(cred, {
    "databaseURL": "https://project.firebaseio.com"
})

app = FastAPI()

@app.post("/users")
async def create_user(email: str):
    ref = db.reference("users")
    new_ref = ref.push({"email": email})
    return {"id": new_ref.key}

@app.get("/users/{user_id}")
async def get_user(user_id: str):
    ref = db.reference(f"users/{user_id}")
    return ref.get()

DynamoDB (AWS)

# requirements.txt
boto3==1.34.0

# main.py
from fastapi import FastAPI
import boto3
from datetime import datetime, timezone

dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('users')

app = FastAPI()

@app.post("/users")
async def create_user(email: str):
    table.put_item(Item={
        "email": email,
        "created_at": datetime.now(timezone.utc).isoformat()
    })
    return {"status": "created"}

@app.get("/users/{email}")
async def get_user(email: str):
    response = table.get_item(Key={"email": email})
    return response.get("Item")

Graph БД

Neo4j

# requirements.txt
neo4j==5.14.0

# main.py
from fastapi import FastAPI
from neo4j import AsyncGraphDatabase

app = FastAPI()
driver = None

@app.on_event("startup")
async def startup():
    global driver
    driver = AsyncGraphDatabase.driver(
        "neo4j://localhost:7687",
        auth=("neo4j", "password")
    )

@app.post("/relationships")
async def create_relationship(user1: str, user2: str):
    async with driver.session() as session:
        await session.run(
            "MATCH (a:User {name: $user1}), (b:User {name: $user2}) "
            "CREATE (a)-[:KNOWS]->(b)",
            user1=user1,
            user2=user2
        )
    return {"status": "connected"}

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

Выбор БД: сравнение

# PostgreSQL — ЛУЧШИЙ выбор для большинства случаев
# ✓ Мощная, надёжная
# ✓ ACID транзакции
# ✓ Полнотекстовый поиск
# ✓ JSON типы
# ✓ Расширения (PostGIS для геоданных)

# MySQL — хороший выбор для веб-приложений
# ✓ Быстрая для чтения
# ✓ Простая в настройке
# ✗ Менее мощная чем PostgreSQL

# SQLite — только для разработки и малых проектов
# ✓ Не требует сервера
# ✓ Идеально для тестов
# ✗ Не подходит для production с высокой нагрузкой

# MongoDB — для неструктурированных данных
# ✓ Гибкая схема
# ✓ Хороша для документов
# ✗ Нет ACID транзакций (в старых версиях)
# ✗ Требует больше памяти

# Redis — только как кэш/очередь
# ✓ Очень быстрый
# ✗ Хранит в памяти
# ✗ Нет персистентности по умолчанию

Лучшие практики

# ✓ ПРАВИЛЬНО
from sqlalchemy.orm import Session
from fastapi import Depends

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/users")
async def list_users(db: Session = Depends(get_db)):
    return db.query(User).all()

# ✓ Используй connection pooling
engine = create_engine(
    DATABASE_URL,
    pool_size=20,
    max_overflow=0,
    pool_pre_ping=True
)

# ✓ Используй миграции (Alembic)
# alembic init alembic
# alembic revision --autogenerate -m "Add users table"
# alembic upgrade head

# ✗ НЕПРАВИЛЬНО
# Создавать новое подключение для каждого запроса
db = SessionLocal()  # ✗ ПЛОХО!

# Использовать raw SQL везде
db.execute("SELECT * FROM users")  # ✗ Уязвимо для SQL injection

Асинхронные драйверы

# requirements.txt
sqlalchemy==2.0.23
asyncpg==0.28.0  # Асинхронный драйвер для PostgreSQL

# DATABASE_URL для асинхронной работы
DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker

engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

async def get_db():
    async with async_session() as session:
        yield session

@app.get("/users")
async def list_users(db: AsyncSession = Depends(get_db)):
    from sqlalchemy import select
    result = await db.execute(select(User))
    return result.scalars().all()

Итого

Выбор БД для FastAPI:

  • PostgreSQL — рекомендуется для production
  • MySQL — альтернатива для веб-приложений
  • SQLite — только для разработки
  • MongoDB — для неструктурированных данных
  • Redis — как кэш и очередь
  • Используй асинхронные драйверы (asyncpg) для лучшей производительности
  • Всегда используй фикстуры зависимостей для управления БД сессиями