Есть ли способ получить данные в организованной форме из базы данных sqlite?

#python #sqlite #discord #discord.py #discord.py-rewrite

#питон #sqlite #Discord #discord.py #python

Вопрос:

Итак, у меня есть база данных sqlite, в которой есть все пользователи на моем сервере и опыт каждого пользователя (как и в любой другой системе прокачки). есть ли способ отправить 10 лучших людей из базы данных в discord? организованно, потому что я получаю это в такой форме.

 [(722267777854865519, 9877, 20),
 (356982883665051659, 8039, 17),
 (746740254173560853, 7358, 17),
 (750497624809013248, 7054, 16),
 (605861925749915752, 6757, 16)]
  

И есть ли способ заставить его упоминать пользователя, а не отправлять их идентификаторы?

(P.S. первое значение — это идентификатор discord пользователя, 2-е — его опыт, а 3-е — его уровень)

под организованной формой я подразумеваю,

  1. упоминание пользователя 1 (не идентификатор пользователя) — Уровень XP

  2. упоминание пользователя 2 (не идентификатор пользователя) — Уровень XP

  3. и т.д. и т.п. до 5.

это код

     @commands.command()
    async def lb(self,ctx):
        records = db.records("SELECT UserID, XP, Level FROM exp ORDER BY XP DESC LIMIT 5")

        await ctx.send(records)
  

Комментарии:

1. Если вы хотите получить помощь, вам придется предоставить более подробную информацию. как вы получаете эти данные? пожалуйста, предоставьте хотя бы фрагмент кода, доступный для выполнения код был бы лучше. Какую «организованную форму» вы ищете? пожалуйста, приведите пример того, что вы хотите. Если вы не предоставите это, вы, вероятно, не получите никакого ценного ответа, и ваш вопрос потенциально будет помечен как «подлежащий закрытию».

2. сейчас лучше? или что-нибудь еще, что я должен добавить? @Tryph

Ответ №1:

  • Есть ли способ получить 10 лучших пользователей?

Отсортируйте свой список и возьмите первые 10 записей.

 records.sort(key=lambda x: x[1], reverse=True)
for user in records[:10]:
# do_something_with_them
  
  • Могу ли я заставить его упоминать пользователя вместо отправки идентификаторов?

Да, вы можете сначала получить user экземпляр этого пользователя, а затем получить его mention атрибут (который вернет строку формата <@!id> ) и отправить это вместо этого.

 user_id = 722267777854865519
user = client.get_user(user_id)
await ctx.send(user.mention)
  

РЕДАКТИРОВАТЬ: Поскольку вы только что отредактировали свой пост, запрашивая точную информацию о том, как выполнить форматирование:

Форматирование их так, как вам нужно, — это всего лишь вопрос создания строки желаемого формата путем перебора ваших записей в for-loop .

 leaderboard = []
for i, user in enumerate(records[:10]):
    leaderboard.append(f"{i   1}. {client.get_user(user[0]).mention} - {user[1]} XP - Level {user[2]}")
await ctx.send("n".join(leaderboard))
  

Имейте в виду, что упоминание всех каждый раз может быть для них действительно раздражающим, и вам, вероятно, следует поместить это внутри embed , поскольку они выделяют свое имя (как обычные упоминания, чтобы вы могли щелкнуть по ним), но не упоминают пользователей.

Комментарии:

1. вместо упоминания, есть ли способ просто отобразить тег имени и не упоминать пользователя?

2. Если вам нужно только их отображаемое имя, используйте .display_name вместо .mention , это вернет их имя в виде строки. Вы не сможете щелкнуть по нему, чтобы перейти в их профиль, хотя, если вы все еще хотите иметь возможность это сделать, я также объяснил это в своем ответе.

Ответ №2:

Используйте for цикл для разделения данных на соответствующие позиции.

 @client.command()
async def leaderboard(ctx):
    data = [(722267777854865519, 9877, 20), (356982883665051659, 8039, 17), (746740254173560853, 7358, 17), (750497624809013248, 7054, 16), (605861925749915752, 6757, 16)]
    for thing in data:
        user = thing[0]
        user_xp = thing[1]
        user_level = thing[2]
        print(f"Member: {user}nLevel: {user_level}nXP: {user_xp}")
  

Вывод:

 Member: 722267777854865519
Level: 20
XP: 9877
Member: 356982883665051659
Level: 17
XP: 8039
Member: 746740254173560853
Level: 17
XP: 7358
Member: 750497624809013248
Level: 16
XP: 7054
Member: 605861925749915752
Level: 16
XP: 6757