【问题标题】:Blacklist SQL Database. Not working Discord.py黑名单 SQL 数据库。不工作 Discord.py
【发布时间】:2021-02-25 01:14:51
【问题描述】:
db = sqlite3.connect("BlacklistedUsers.db")
c = db.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS "BlacklistedUser_IDs" (
    "User_IDs"  INTEGER,
    "Reason"    TEXT,
    PRIMARY KEY("User_IDs")
);''')

def owner_ID(ctx):
    return ctx.author.id == 738332946934661132

def not_allowed(ctx):
    member = ctx.discord.member.id
    c.execute("SELECT `User_IDs` FROM `BlacklistedUser_IDs` WHERE `User_IDs`=%s", (member))
    UserID = cursor.fetchall()
    if ctx.author.id not in UserID:
        print(UserID)
        return True
    else:
        return False

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.CheckFailure):
        embed = discord.Embed(title="", description="", colour=discord.Color.red())
        embed.set_author(name="BlackListed!")
        embed.add_field(name="Sorry", value=f"{ctx.author} It looks like you've been Blacklisted! for {Reason}", inline=False)
        embed.add_field(name="If you would like to Appeal Or think this might have been a mistake Message", value="@L Y N X", inline=False)
        await ctx.send(embed=embed)

@bot.command()
@commands.check(owner_ID)
async def blacklist(ctx, member: discord.Member, *, reason=None):
    c.execute("INSERT INTO `BlacklistedUser_IDs`(User_IDs, Reason) VALUES(%s, %s)", (member.id, reason))
    db.commit()
    embed = discord.Embed(title="", description="", colour=discord.Color.red())
    embed.set_author(name="Blacklisted!")
    embed.add_field(name="Success", value=f"{member.name}#{member.discriminator} -- {member.id} Has been Blacklisted from Using commands!")
    embed.add_field(name="Reason : ", value=f"{reason}")
    await ctx.send(embed=embed)

@bot.command()
@commands.check(owner_ID)
async def unblacklist(ctx, member: discord.Member):
    c.execute("DELETE FROM BlacklistedUser_IDs WHERE User_IDs =%s AND Reason=%s;", (member.id, reason))
    db.commit()
    embed = discord.Embed(title="", description="", colour=discord.Color.red())
    embed.set_author(name="Unblacklisted!")
    embed.add_field(name="Success", value=f"{member.name}#{member.discriminator} -- {member.id} Has been Unblacklisted from Using commands!")
    await ctx.send(embed=embed)

当尝试运行此命令时,它不会运行 Fullstop.. 它会运行 SQL 之上的任何内容,但是当涉及到 SQL 时,它不会运行,无论是黑名单还是非黑名单?一切看起来都是正确的,所以我对出了什么问题感到困惑..

任何解决方案 // 问题修复?

【问题讨论】:

  • “它不会运行”是什么意思?有错误吗?脚本会停止吗?如果可以,请提供更多详细信息
  • 我运行该命令,但它会停止并且不会在命令代码中运行任何内容,c.execute 以上的任何内容都会运行,但c.execute 似乎是 1) 破坏整个代码,2)不起作用,它不会将任何东西放入数据库或任何东西,这让我感到困惑,因为它看起来正确,但 SQL 似乎打破了这一点..

标签: python database sqlite discord discord.py-rewrite


【解决方案1】:

您的代码示例中存在一些问题:

  • 插入数据的方式不对
  • dbc 未定义
  • 您的 commands.check() 装饰器似乎有误

假设您的表名为table,它有两行命名为row_1row_2。如果你想插入两个值,例如var_1var_2,你可以这样做:

with sqlite3.connect('database.db') as connection:
    cursor = connection.cursor()
    cursor.execute('INSERT INTO table(row_1, row_2) VALUES(?, ?)', (var_1, var_2))
    connection.commit()

您的第二个错误可能来自@commands.check(owner_ID)。如果它只是一个 ID,那么您使用 commands.check() 的方式是错误的。在这种情况下,如果您的目标是让这个命令只有机器人创建者可以访问,您可以使用@commands.is_owner()

@bot.command()
@commands.is_owner()
async def blacklist(ctx, member: discord.Member, *, reason=None):
    ...

进行所有这些更改后,您的代码将如下所示:

from sqlite3 import connect

@bot.command()
@commands.is_owner()
async def blacklist(ctx, member: discord.Member, *, reason=None):
    with connect('BlacklistedUsers.db') as conn:
        c = conn.cursor()
        c.execute("INSERT INTO BlacklistedUser_IDs(User_IDs, Reason) VALUES(?, ?)", (member.id, reason))
        conn.commit()

    embed = discord.Embed(colour=discord.Color.red())
    embed.set_author(name="Blacklisted!")
    embed.add_field(name="Success", value=f"{member.name}#{member.discriminator} -- {member.id} Has been Blacklisted from Using commands!")
    embed.add_field(name="Reason :", value=f"{reason}")
    await ctx.send(embed=embed)

对于您的is_allowed() 功能:请注意,我将ctx 更改为member_id,因为您只需要会员ID。当您调用此函数时,您只需传递成员 ID(例如 is_allower(ctx.member.id)):

def not_allowed(member_id):
    with connect('BlacklistedUsers.db') as conn:
        c = conn.cursor()
        c.execute("SELECT User_IDs FROM BlacklistedUser_IDs WHERE User_IDs=?", (member,))
    UserIDs = cursor.fetchall()
    return False if member_id in UserIDs else True

【讨论】:

  • 我把定义放在最上面,让我抓紧时间,
  • 我已经更新了源问题^
  • 我提供的代码示例应该可以工作。仅在需要时才应创建连接器和光标。另外,如果 738332946934661132 是您的 ID,则不需要 commands.check(),只需使用 commands.is_owner()
  • 我对 SQL lmao 很陌生,所以选择和删除是我现在遇到的主要问题,
  • 你需要做的:删除ower_ID函数/将装饰器替换为@commands.is_owner()/用我给你的代码替换你的blacklist函数。由于您的数据库已经生成,您可以删除代码开头的所有 sqlite 部分 :) 您还必须调整我在 not_allowed 函数中提供的 sqlite 代码示例
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多