5.6 Написание запросов к БД используя SQLAlchemy, часть 1
6 из 6 шагов пройдено
1 из 1 баллa  получен

Метод создания категории

Как мы уже помним, у нас есть Pydantic модель, которая находится в файле shemas.py:

class CreateCategory(BaseModel):
    name: str
    parent_id: int | None

Именно она будет отвечать за создание наших категорий. Откроем файл category в папке routers, и начнем реализацию нашего проекта с метода создания категорий:

from fastapi import APIRouter, Depends, status, HTTPException
from sqlalchemy.orm import Session
from app.backend.db_depends import get_db
from typing import Annotated

from app.models import *
from sqlalchemy import insert
from app.schemas import CreateCategory

from slugify import slugify



@router.post('/create')
async def create_category(db: Annotated[Session, Depends(get_db)], create_category: CreateCategory):
    db.execute(insert(Category).values(name=create_category.name,
                                       parent_id=create_category.parent_id,
                                       slug=slugify(create_category.name)))
    db.commit()
    return {
        'status_code': status.HTTP_201_CREATED,
        'transaction': 'Successful'
    }

Первым делом мы импортируем необходимые нам модули. В нашей функции создания записи мы подключаем зависимость сессии БД, и получаем нашу модель из POST запроса. В SQLAlchemy 2.0 появился новый интерфейс запросов, именно его мы и используем. Подробнее о INSERT вы можете посмотреть в документации. После добавления, для подтверждения изменений у объекта Session вызывается метод commit().

Так как мы хотим получать поле slug динамически, мы это делаем используя библиотеку Slugify, установим ее:

pip install python-slugify

Функция slugify - конвертирует строку, преобразовывая пробелы в дефисы, удаляя символы которые не являются буквенно-цифровыми, подчеркиваниями или дефисами, конвертирует в нижний регистр и удаляет пробелы в начале и конце текста.

Если мы хотим посмотреть аналогию со старыми запросами в SQLAlchemy, то наш запрос выглядел бы следующим образом:

    category_model = Category(
        name=create_category.name,
        parent_id=create_category.parent_id,
        slug=slugify(create_category.name)
    )
    db.add(category_model)
    db.commit()

Запустим проект командой uvicorn app.main:app --reload и проверим работу. Перейдем в конечную точку создания категории, и попробуем создать новую категорию:

В результате мы получим код ответа 201, говорящий, что запрос выполнен успешно и привёл к созданию ресурса. Теперь откроем нашу БД в любом редакторе SQLite, и перейдя в таблицу category увидим следующее:

Мы видим что наша категория была успешно создана, ей автоматически было присвоено поле slug и is_active. В следующем шагах мы реализуем вывод всех категорий, а также удаление и изменение категорий.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.

А почему в документации значится ожидаемый код успешного ответа 200, хотя мы меняли на 201?

@Anonymous_38661511, разобрался. Нужно в декораторе @router.post добавить параметр status_code

из-за чего может быть эта ошибка: sqlalchemy.exc.CompileError: Unconsumed column names: parent_id?
Все попробовал, но ничего не помогает
 

@Georg_Yakovelev, Нужно больше информации. Пробовали открыть БД редактором? Там есть этот столбец?

@Илья_Перминов, Разобрался. Да, не было столбца в базе, т.к. я после экспериментов своих забыл вернуть вид, который был в курсе представлен..
Благодарю!