在不同的响应中获得许多结果? Discord.py / SQLite

问题描述

所以我试图创建一个 /modlogs 命令,它会向其他人显示用户的每个日志。这意味着 Warns,Mutes,Bans,Unmutes,Unbans。我设法找到了一种方法并存储了大部分数据。我目前正在尝试获取该数据并使用它。我的问题是机器人不会像我想要的那样回答。

之前展示我的代码等。我需要先向您展示我想要实现的目标。所以这是我想要实现的一个例子:

enter image description here

如您所见,运行该命令后,客户端将响应一些数据。 (Action,Date,Mod,Reason)。它还响应不同的消息,这也是我想要实现的目标。

关于我的代码,我尝试了两种不同的方法

首先:

    @commands.command()
    @commands.has_permissions(manage_messages=True)
    async def modlogs(self,ctx,user : discord.Member):

        db = sqlite3.connect("main.sqlite")
        cursor = db.cursor()
        cursor.execute(f"SELECT guild_id FROM modlogsdb WHERE user_id = {user.id}")
        result = cursor.fetchone()
        if result is None:
            await ctx.channel.send("This user has no Logs.")
        elif result is not None:
            cursor.execute(f"SELECT type FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
            result = cursor.fetchone()
            cursor.execute(f"SELECT reason FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
            result1 = cursor.fetchone()
            await ctx.channel.send(f"TYPE: {str(result[0])} - REASON: {str(result1[0])}")
        db.commit()
        cursor.close()
        db.close()

如你所见,我已经添加了两个结果,这里的问题是它应该显示数据库中的每个结果,但它只显示一行。

enter image description here

类似这样,但数据库中有更多数据:

enter image description here

================================================ ==================================================== /p>

第二次尝试:

在尝试第一个之后,我做了一些改变:

    @commands.command()
    @commands.has_permissions(manage_messages=True)
    async def modlogs(self,user : discord.Member):

        db = sqlite3.connect("main.sqlite")
        cursor = db.cursor()
        cursor.execute(f"SELECT guild_id FROM modlogsdb WHERE user_id = {user.id}")
        result = cursor.fetchone()
        if result is None:
            await ctx.channel.send("This user has no Logs.")
        elif result is not None:
            cursor.execute(f"SELECT type FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
            result = cursor.fetchall()
            cursor.execute(f"SELECT reason FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
            result1 = cursor.fetchall()
            await ctx.channel.send(f"TYPE: {str(result[0])} - REASON: {str(result1[0])}")
        db.commit()
        cursor.close()
        db.close()

我基本上添加fetchall() 以便获取每一行,然后再试一次。我得到的第一个问题是响应在括号内。我得到的第二个问题是,原因在同一条线上。像这样:

enter image description here

那么有什么想法可以避免这些,或者至少设法获取我在第一张图片显示的信息?

解决方法

您的第二个 SQL 查询

SELECT reason 
FROM modlogsdb 
WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}

将返回用户被警告/静音/...的所有原因的列表

更好的方法是将每种类型的原因一一获取,即

SELECT reason 
FROM modlogsdb 
WHERE guild_id = {ctx.guild.id} 
  AND user_id = {user.id} 
  AND type = "Warning"

这将返回用户被警告的所有原因。

或者,我想如果你使用

SELECT type,reason 
FROM modlogsdb 
WHERE guild_id = {ctx.guild.id} 
  AND user_id = {user.id}

你会得到一个包含 [('Warning','Bad Words'),('Warning','NSFW Emojis')] 或类似内容的元组列表

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...