FastAPI: База данных SQLite — Урок 6

Подключение библиотек

Для работы с базами данных в FastAPI используются различные библиотеки. В этом уроке используется SQLite из-за простоты интеграции. В дальнейшем аналогичным образом можно интегрировать другие СУБД (MySQL, PostgreSQL и др.).

Необходимо установить следующие библиотеки:

pip install sqlalchemy sqlite

Схемы данных (schemas.py)

Файл schemas.py содержит схемы данных — классы, описывающие структуру данных для взаимодействия с API. Используется библиотека Pydantic.

from pydantic import BaseModel

class UserBase(BaseModel):
    name: str
    age: int

class User(UserBase):
    id: int
    class Config:
        orm_mode = True

class UserCreate(UserBase):
    pass

class PostBase(BaseModel):
    title: str
    body: str
    author_id: int

class PostCreate(PostBase):
    pass

class Post(PostBase):
    id: int
    class Config:
        orm_mode = True

Определены базовые классы UserBase и PostBase, содержащие основные поля, и классы User, UserCreate, Post, PostCreate, наследующие базовые классы и добавляющие поле id для объектов в базе данных. orm_mode = True позволяет Pydantic работать с объектами ORM.

Подключение к базе данных (database.py)

Файл database.py описывает подключение к базе данных SQLite:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./itproger.db"  # Подключение к SQLite базе данных

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

Создается движок базы данных (engine), SessionLocal – функция для создания сессий, Base – базовый класс для моделей.

Модели данных (models.py)

Файл models.py содержит описание моделей баз данных, используя SQLAlchemy:

import sqlalchemy as sa
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

from .database import Base

class User(Base):
    __tablename__ = "users"

    id = sa.Column(sa.Integer, primary_key=True, index=True)
    name = sa.Column(sa.String, index=True)
    age = sa.Column(sa.Integer)
    posts = relationship("Post", back_populates="author")

class Post(Base):
    __tablename__ = "posts"

    id = sa.Column(sa.Integer, primary_key=True, index=True)
    title = sa.Column(sa.String, index=True)
    body = sa.Column(sa.String)
    author_id = sa.Column(sa.Integer, sa.ForeignKey("users.id"))
    author = relationship("User", back_populates="posts")

Определены модели User и Post с соответствующими полями и связью «один-ко-многим» между ними.

Основной файл приложения

Основной файл приложения содержит функции для работы с базой данных:

import uvicorn
from fastapi import FastAPI, Depends, HTTPException, status
from sqlalchemy.orm import Session
from .database import SessionLocal, engine, Base
from .models import User, Post
from .schemas import UserCreate, PostCreate, User as UserSchema, Post as PostSchema


Base.metadata.create_all(bind=engine)

app = FastAPI()

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


@app.post("/users/", response_model=UserSchema)
async def create_user(user: UserCreate, db: Session = Depends(get_db)):
    db_user = User(name=user.name, age=user.age)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user


@app.post("/posts/", response_model=PostSchema)
async def create_post(post: PostCreate, db: Session = Depends(get_db)):
    db_user = db.query(User).filter(User.id == post.author_id).first()
    if db_user is None:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
    db_post = Post(title=post.title, body=post.body, author_id=post.author_id)
    db.add(db_post)
    db.commit()
    db.refresh(db_post)
    return db_post


@app.get("/posts/", response_model=list[PostSchema])
async def get_posts(db: Session = Depends(get_db)):
    posts = db.query(Post).all()
    return posts

Определены функции create_user, create_post и get_posts для создания пользователей, постов и получения всех постов. Функция get_db управляет сессиями базы данных.

В этом уроке подключена база данных SQLite к приложению FastAPI, созданы модели данных с помощью SQLAlchemy и реализованы основные функции для взаимодействия с базой данных. Это позволило создать функциональное API для управления пользователями и постами.

Что будем искать? Например,программа