【问题标题】:Get many results in different responds? Discord.py / SQLite在不同的响应中获得许多结果? Discord.py / SQLite
【发布时间】:2021-06-13 15:42:36
【问题描述】:

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

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

如您所见,在运行命令后,客户端将响应一些数据。 (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()

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

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

================================================ =================================================

第二次尝试:

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

    @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.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(),所以它得到了每一行,然后再试一次。我遇到的第一个问题是响应在括号内。我遇到的第二个问题是,原因在同一行。像这样的:

那么任何想法如何避免这些或至少设法获得我在第一张图片中显示的信息?

【问题讨论】:

    标签: python-3.x sqlite discord.py


    【解决方案1】:

    您的第二个 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')] 或类似内容的元组列表

    【讨论】:

    • 最后一个不行。至于第二个,它有点工作。它仍然无法按我的意愿工作。首先原因看起来像这样('Bad Words',)。如何删除(,)。还使用for user_id in result:,然后为每个user_id 创建一条消息?
    • 好吧a = ('Bad Words',) 只是一个tuple,所以你可以使用a[0] 来访问字符串"Bad Words"
    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多