Передача данных по функциям в 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 шт):
Вы вероятно не поняли меня в комментариях поэтому поясню в ответе. Я предлагаю такой код:
# Обработчик кнопки "Рассылка" /админ
@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 не менялась.