Передача данных по функциям в Python. Aiogram и Sqlite

Всем привет. Я пишу бота для Телеграма, используя aiogram 3 и SqLite 3. Я столкнулся с проблемой, которая поставила меня в тупик и из-за которй я не могу продолжать писать уже больше недели. Для начала представлю фрагменты кода, которые понадобятся при объяснении вопроса:

Из файла main:

# Обработчик кнопки "Рассылка" /админ
@dp.message(F.text == ButtonsText.mailing_butt, TheSM.admin_pan)
async def on_mailing_butt(message: types.Message, state: FSMContext):
    await message.answer("Введите текст рассылки")
    await state.set_state(TheSM.wait_mailing_text)


# Приём текста рассылки
@dp.message(F.text, TheSM.wait_mailing_text)
async def mailing_text(message: types.Message, state: FSMContext):
    await ins_mailing(message.text, message.photo, message.from_user.id)
    await message.answer("Введите дату отправки в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС")
    await state.set_state(TheSM.wait_mailing_date)


# Приём даты рассылки
@dp.message(F.text, TheSM.wait_mailing_date)
async def mailing_date(message: types.Message, state: FSMContext):
    await date_mailing(message.text, message.date)
    await message.answer("Рассылка принята")
    await state.set_state(TheSM.admin_pan)

Из файла sql:

# запись данных о рассылке
async def ins_mailing(text, photo, admin_id):
    cur.execute("INSERT INTO mailings (text, photo, admin_id, send) VALUES (?, ?, ?, 0)", (text, photo, admin_id))
    id_db = cur.execute("SELECT id FROM mailings ORDER BY id DESC LIMIT 1")
    db.commit()
    return text, photo, admin_id, id_db


# добавление даты рассылки
async def date_mailing(id_db, send_date, create_date):
    cur.execute("UPDATE mailings SET (send_date, create_date) VALUES (?, ?) WHERE id = ?", (send_date, create_date, id_db))
    db.commit()

На данный момент всё выглядит так. Как вы наверное уже поняли - здесь я пытаюсь записать данные о рассылке в базу данных. В функции mailing_text я забираю большую часть данных о рассылке, такие как: Текст, фото и айди создавшего админа, далее я передаю это в функцию ins_mailing, где записываю в бд, также добавляя значение к столбцу send(он имеет два значения и говорит о том, была отправлена рассылка или нет). После принятия текста у админа, я запрашиваю у него дату рассылки и пытаюсь передать её вместе с датой создания в функцию date_mailing. В неё я пытаюсь записать эти данные в строку к определённой рассылке (у каждой есть свой айди в таблице), но я не могу подогнать сюда айдишник рассылки, потому что мне нужно сначала передать его в функцию mailing_date, откуда я отдам его вместе с датами создания и отправки в функцию date_mailing.

Я пытался сразу передавать айди из функции ins_mailing, но тогда возникает ошибка при отправке данных в date_mailing:

    await date_mailing(message.text, message.date)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: date_mailing() missing 1 required positional argument: 'create_date'

Она говорит как раз таки о том, что мне нужно здесь передавать также и айдишник, потому что функция date_mailing принимает 3 параметра и у меня не получается передать два из одной функции, а третий из другой.

Очень надеюсь на вашу помощь, так как хочу продолжать проект, но не могу, потому что тут стопор.


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

Автор решения: gord1402

Вы вероятно не поняли меня в комментариях поэтому поясню в ответе. Я предлагаю такой код:

# Обработчик кнопки "Рассылка" /админ
@dp.message(F.text == ButtonsText.mailing_butt, TheSM.admin_pan)
async def on_mailing_butt(message: types.Message, state: FSMContext):
    await message.answer("Введите текст рассылки")
    await state.set_state(TheSM.wait_mailing_text)


# Приём текста рассылки
@dp.message(F.text, TheSM.wait_mailing_text)
async def mailing_text(message: types.Message, state: FSMContext):
    # Получаем необходимые значения из функции
    text, photo, admin_id, id_db = await ins_mailing(message.text, message.photo, message.from_user.id)
    await message.answer("Введите дату отправки в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС")
    await state.set_state(TheSM.wait_mailing_date)
    # Сохраняем id в стейт
    await state.set_data({"id_db": id_db})


# Приём даты рассылки
@dp.message(F.text, TheSM.wait_mailing_date)
async def mailing_date(message: types.Message, state: FSMContext):
    # Загружаем id из стейта
    id_db = (await state.get_data())["id_db"]
    # Используем
    await date_mailing(id_db, message.text, message.date)
    await message.answer("Рассылка принята")
    await state.set_state(TheSM.admin_pan)

Часть Sql не менялась.

→ Ссылка