Генерировать сообщение в зависимости от количества данных
Как динамически изменять содержимое сообщения. Делаю личный кабинет для коммунального предприятия. У пользователя может быть несколько лицевых счетов. У меня есть кусок кода, но он не работает должным образом. Из запроса я получаю список кортежей, после через итератор собираю сообщение и отправляю его пользователю. Мне помог ответ https://ru.stackoverflow.com/questions/1561193/Динамически-подставить-данные-в-сообщение , чтобы собрать сообщение. Но так как после итерации text становится str() я не могу обращаться к элементам кортежа и работать с ними в сообщении. Пример кода:
@dp.message_handler(text = '123')
async def generate(message: types.Message):
db = fdb.connect(
dsn=config.connect,
user=config.user,
password=config.password,
charset=config.charset
)
cur = db.cursor()
text = ''
mes = message.from_user.id
res = cur.execute("SELECT OTVET, LS, ADRES, FIO FROM TG_GET_INFO(11, NULL, ?)", (mes,)).fetchall()
for item in res:
text = f"{text}{item}"
await bot.send_message(message.from_user.id, f"text {text}")
db.commit()
db.close()
Пример как должно выглядеть сообщение:
То если если у пользователя 1 лицевой счёт, то в сообщении он будет один, если 4 - то соответственно 4. Данные к ним берутся из sql - запроса с которым у меня проблема.
Пример списка кортежей:
[(100, '330708', 'ул. Люботинская, д. 23, кв. а', 'Опришко В.Ф.'), (100, '516165', 'ул. Дружбы Народов, д. 4, кв. 47', 'Семен Семеныч'), (100, '756412', 'ул. Тургенева, д. 5, кв. 30д', 'Петришко А.В.'), (100, '485157', 'ул. Житомирская, д. 28, кв. ', 'Шевченко П.В.')]
Ответы (2 шт):
Не особо понимаю зачем каждый раз назначать переменную для text. Ведь можно просто эту переменную дополнять.
for i in range(len(res)):
text += f"Личный счёт №{i}\n" # Порядок итерации как номер счёта
text += f"{res[i]}\n" # Данные в виде кортежа.
Без понятия как выглядит Ваша база данных, но предположу, что по фильтру пользователя можно увидеть строки с данными его счетов. Поэтому можно создать фильтр SQL по определённому пользователю.
SELECT * FROM table WHERE user_id = '#Здесь id пользователя в ЛК#';
Примечание: При такой записи данные будут заполняться бесконечно, но а если будет очень много счетов? Защитите себя от этого с помощью фильтра SQL через OFFSET и LIMIT, и создайте листинг через inline-кнопки.
Примерная схема: Создаётся лимит из 5 лицевых счетов. inline-кнопки работают как листинг между этими лимитами на сообщение и изменяют исходное сообщение.
my_tuple = [(100, '330708', 'ул. Люботинская, д. 23, кв. а', 'Опришко В.Ф.'),
(100, '516165', 'ул. Дружбы Народов, д. 4, кв. 47', 'Семен Семеныч'),
(100, '756412', 'ул. Тургенева, д. 5, кв. 30д', 'Петришко А.В.'),
(100, '485157', 'ул. Житомирская, д. 28, кв. ', 'Шевченко П.В.')]
text = '?Кабинет_абонента'
for value in my_tuple:
a, b, v, e = value
text += f'\n ?КАТП {a} \n ?О\р {b} \n ?Адрес {v} \n ?ФИО {e} \n '
print(text)
Удачи^^
