Ошибка KeyError: 'name'

Есть код User.py:

import asyncio
from aiogram import Router, F
from aiogram.types import Message, CallbackQuery
from aiogram.filters import CommandStart
from aiogram.fsm.context import FSMContext

from app.database.requests import set_user, get_user, save_user_to_db
import app.keyboards as kb
from app.states import Description_problems, Registry

user = Router()
@user.message(F.text == "↩️ На главную")
@user.message(F.text == "↩️ Главная")
@user.message(F.text == "❌ Отмена")
@user.message(CommandStart())
async def cmd_start(message: Message, state: FSMContext):
    await set_user(message.from_user.id)
    await message.answer("Добро пожаловать в систему приёма заявок на ремонт и подключения конференций! ?\n\nЗдесь вы можете быстро отправить заявку на ремонт оборудования или запросить подключение конференции. Пожалуйста, выберите, что вы хотите сделать:", reply_markup=kb.application)
    await state.clear()

@user.message(F.text == "Нет, начать заново ❌")
@user.message(F.text == "Личный кабинет ⚙️")
async def get_profile(message: Message):
    user = await get_user(message.from_user.id)
    user_info = await get_user(tg_id=message.from_user.id)
    text = (f'? Ваш ID: {message.from_user.id}\n\n'
            f'? Имя: {user.name}\n\n'
            f'? Фамилия: {user.surname}\n\n'
            f'? Отчество: {user.patronymic}\n\n'
            f'? Отдел: {user.department}\n\n'
            f'? Кабинет: {user.office}\n\n')

    await message.answer(text, reply_markup=kb.profile)


@user.message(F.text == "Изменить учётные данные")
async def register(message: Message, state: FSMContext):
    await state.set_state(Registry.name)
    await message.answer("Введите ваше имя")


@user.message(Registry.name)
async def register_name(message: Message, state: FSMContext): # Здесь мы ловим состояние
    await state.update_data(name=message.text)

    await state.set_state(Registry.surname)
    await message.answer("Отлично, теперь введите вашу фамилию")# Здесь мы выводим сообщение для того, чтобы пользователь знал какие данные ему надо вводить в бота


@user.message(Registry.surname)
async def register_name(message: Message, state: FSMContext):
    await state.update_data(surname=message.text)
    await state.set_state(Registry.patronymic)
    await message.answer("Отлично, теперь введите ваше отчество")

@user.message(Registry.patronymic)
async def register_name(message: Message, state: FSMContext):
    await state.update_data(patronymic=message.text)
    await state.set_state(Registry.department)
    await message.answer("Хорошо, теперь введите ваш отдел")

@user.message(Registry.department)
async def register_name(message: Message, state: FSMContext):
    await state.update_data(department=message.text)
    await state.set_state(Registry.office)
    await message.answer("Хорошо, теперь введите ваш кабинет")

@user.message(Registry.office)
async def register_name(message: Message, state: FSMContext):
    await state.update_data(office=message.text)
    data = await state.get_data()# Здесь мы вытаскиваем все наши данные
    await message.answer("Завершить регистрацию?", reply_markup=kb.YESandNOregistry)
    await state.clear()


@user.message(F.text == "Да, завершить регистрацию ✅")
async def save_user(message: Message, state: FSMContext):
    data = await state.get_data()
    await save_user_to_db(data["name"], data['surname'], data['patronymic'], data['department'], data['office'], message.from_user.id, data)
    await message.answer("Регистрация успешно завершена",reply_markup=kb.home)

request.py:

from app.database.models import async_session
from app.database.models import User, Application
from sqlalchemy import select, update, delete, desc
def connection(func):
    async def inner(*args, **kwargs):
        async with async_session() as session:
            return await func(session, *args, **kwargs)
    return inner



@connection
async def set_user(session, tg_id):
    user = await session.scalar(select(User).where(User.tg_id == tg_id))
    if not user:
        session.add(User(tg_id=tg_id, name="User", surname="User", patronymic="User", department="No", office="No"))
        await session.commit()



@connection
async def get_user(session, tg_id):
    return await session.scalar(select(User).where(User.tg_id == tg_id))

@connection
async def get_users(session):
    return await session.scalars(select(User))

@connection
async def save_user_to_db(session, data):
    # Предположим, вы хотите найти пользователя по имени из данных
    user = await session.scalar(select(User).where(User.name == "test"))

    if not user:
        # Если пользователь существует, обновляем его данные
        await session.execute(
            update(User).where(User.id == user.id).values(
                name=data["name"],
                surname=data['surname'],
                patronymic=data['patronymic'],
                department=data['department'],
                office=data['office']
            )
        )
    await session.commit()

models.py:

from sqlalchemy import ForeignKey, String, BigInteger
from sqlalchemy.orm import Mapped, mapped_column, DeclarativeBase, relationship, sessionmaker
from sqlalchemy.ext.asyncio import AsyncAttrs, async_sessionmaker, create_async_engine
from datetime import datetime

engine = create_async_engine(url="sqlite+aiosqlite:///db.sqlite3",
                             echo=True) # Здесь мы создали подключение к БД

async_session = async_sessionmaker(engine) # Здесь мы подключились к нашей БД


class Base(AsyncAttrs, DeclarativeBase):
    pass


class User(Base):
    __tablename__ = 'users'

    id: Mapped[int] = mapped_column(primary_key=True)
    tg_id = mapped_column(BigInteger)
    name: Mapped[str] = mapped_column(String(15))
    surname: Mapped[str] = mapped_column(String(15))
    patronymic: Mapped[str] = mapped_column(String(15))
    department: Mapped[str] = mapped_column(String(20))
    office: Mapped[int] = mapped_column(String(4))

class Application(Base):
    __tablename__ = 'applications'
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(ForeignKey("users.name"))
    surname: Mapped[str] = mapped_column(ForeignKey("users.surname"))
    patronymic: Mapped[str] = mapped_column(ForeignKey("users.patronymic"))
    department: Mapped[str] = mapped_column(ForeignKey("users.department"))
    office: Mapped[int] = mapped_column(ForeignKey("users.office"))
    category: Mapped[str] = mapped_column(String(15))
    Description: Mapped[str] = mapped_column(String(500))
    data: Mapped[str] = mapped_column(String(15))
    time: Mapped[str] = mapped_column(String(8))
    conference: Mapped[str] = mapped_column(String(8))



async def async_main():
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)

states.py:

from aiogram.fsm.state import StatesGroup, State



class Newsletter(StatesGroup):
    message = State()

class Description_problems(StatesGroup):
    category = State()
    text = State()
    data = State()
    time = State()
    conference = State()


class Registry(StatesGroup):
    name = State()
    surname = State()
    patronymic = State()
    department = State()
    office = State()

Однако при попытке сохранения состояния в базу данных возникает ошибка:

File "C:\Users\Мурад\PycharmProjects\Telegram bot giz\app\user.py", line 84, in save_user
    await save_user_to_db(data["name"], data['surname'], data['patronymic'], data['department'], data['office'], message.from_user.id, data)
                          ~~~~^^^^^^^^
KeyError: 'name'

Как мне сохранить данные пользователя, которые хранятся в состояниях?


Ответы (0 шт):