Телеграм бот на пайтоне с Postgresql
Всем привет! Решил запилить проект на aiogram3 u postgresql, но зашёл в тупик. Задача бота принимать ключевый слова и по ним искать в базе данных информацию. То есть если я пишу /search 80 то он должен выдать значения двух игроков по этому параметру(снизу база данных, в данном случае это lennet и pico), но выдаёт только информацию на 1 человека. Я думал попробовать сделать это через циклы for, но не получилось.
Вот база:
А вот код:
@dp.message(Command('search'))
async def search(message: Message):
#тут будет поиск в бд
arg = message.text.split() #получаем данные юзера
args = str(arg.pop(1)) #удаляем элемент т.к arg содержит в себе /search
try:
connection = psycopg2.connect( # конектимся к бд
host="127.0.0.1",
user="postgres",
password="staff",
database="wow_klass№2",
port="5432"
)
connection.autocommit = True
zapros = f"SELECT * FROM spek WHERE nikname = '{args}' OR class = '{args}' OR spek = '{args}' OR profa = '{args}' OR lvl = '{args}';"
int = f" SELECT COUNT(*) FROM spek WHERE nikname = '{args}' OR class = '{args}' OR spek = '{args}' OR profa = '{args}' OR lvl = '{args}';"
##### запрос в бд
with connection.cursor() as iner:
iner.execute(int)
integer = iner.fetchone()
with connection.cursor() as cursor:
cursor.execute(zapros)
#закончу тут, появился норм запрос и ответ, осталось реализовать больше 1 участника
tuple = cursor.fetchone()
nic = str(tuple[0])
clas = str(tuple[1])
spek = str(tuple[2])
prof = str(tuple[3])
lvl = str(tuple[4])
await message.answer(f"Ник игрока: {nic}. \nКласс: {clas}. \nСпек: {spek}. \nПрофесия: {prof}. \nlvl: {lvl}")
except Exception as _ex:
print(_ex)
finally:
if connection:
connection.close()
print("Отсоеденился успешно")
Ответы (1 шт):
Как должно быть понятно из названия, cursor.fetchone (fetch one) возвращает одну запись.
Для получения всех записей, нужно использовать cursor.fetchmany и затем пройтись циклом по результату.
На каждой итерации цикла можно добавлять в строку данные игроков, чтобы построить одну большую строку со всеми данными. Но нужно учитывать лимиты сообщения в Телеграме.