Подключение библиотек
Для работы с базами данных в 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 для управления пользователями и постами.