【问题标题】:How can I use something stored in a DataBase? SQLite / Python如何使用存储在数据库中的内容? SQLite/Python
【发布时间】:2021-06-09 12:10:40
【问题描述】:

所以,我是数据库的新手,我有一个问题。我首先在互联网上进行了重新搜索,但找不到任何东西,或者实际上我无法正确理解他们在解释什么。在开始我的问题之前,我想说我目前正在以 Python 作为主要语言的 Discord Bot 工作,并且我正在尝试创建一个 per-server-prefix 系统。我已经成功了一次,但格式为.JSON。然后我听说使用.JSON 来保存这种数据实际上并不好所以我搬到了DataBases。现在,我的问题是:

我已将guild_id 和prefix 存储在我的数据库中,如何将其用于per-server-prefix 系统?除了编写代码来存储两个文本之外,我还没有尝试过任何东西。如果有人能向我解释而不只是告诉我代码,我真的很高兴!任何答案将不胜感激

Main.py:

def get_prefix(client, message):

    db = sqlite3.connect("main.sqlite")
    cursor = db.cursor()
    cursor.execute(f"SELECT prefix FROM prefixes WHERE guild_id = {message.guild.id}")
    result = cursor.fetchone()
    if result is None:
        return "/"
    else:
        

client = commands.Bot(command_prefix = get_prefix)

Prefixes.py (COGS):

    @commands.command()
    @commands.has_permissions(administrator=True)
    async def prefix(self, ctx, prefix=None):

        db = sqlite3.connect("main.sqlite")
        cursor = db.cursor()
        cursor.execute(f"SELECT prefix FROM prefixes WHERE guild_id = ?", ctx.guild.id)
        result = cursor.fetchone()
        if result is None:
            sql = ("INSERT INTO prefixes(guild_id, prefix) VALUES(?,?)")
            val = (ctx.guild.id, prefix)
            await ctx.channel.send(f"{prefix}")
        elif result is not None:
            sql = ("UPDATE prefixes SET prefix = ? WHERE guild_id = ?")
            val = (prefix, ctx.guild.id)
            await ctx.channel.send(f"update `{prefix}`")
        cursor.execute(sql, val)
        db.commit()
        cursor.close()
        db.close()

这几乎是整个代码。如果您认为有什么需要改变或有任何建议,请在 cmets 中回答!

【问题讨论】:

  • 我不完全确定问题出在哪里。据我所知,您的代码应该可以工作。您需要做的就是在else 子句之后返回result。
  • 这就是重点,我不知道else 会是什么。正如我所说,我是数据库的新手,我还在学习。所以我问是否有人知道else 将如何工作。
  • 啊啊啊。在这种情况下,我已经在下面发布了我的答案。

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


【解决方案1】:

您需要做的就是在else 之后加上return result。例如:

result = cursor.fetchone()
if result is None:
    return "/"
else:
    return result

cursor.fetchone() 返回一个元组,其中包含行中请求的每个元素,因为您只请求前缀,它将只包含允许的(例如:("!",)),因为您的 command_prefix 可调用可以返回一个字符串或字符串元组。

警告: 您可能需要添加检查以确保有人没有指定空字符串(其中没有任何内容的零长度字符串)作为其前缀,否则您的机器人将尝试将它看到的每条消息都作为命令运行

参考:discord.ext.commands.Bot.command_prefix

【讨论】:

  • 该死的我现在觉得自己很蠢,说实话这有点容易。无论如何,谢谢你的回答。还有关于Warning,你的意思是我应该给每个设置"" 前缀的人一个错误?
  • 我使用"" 显示一个空字符串(例如:其中没有任何内容)。只需检查某人设置的前缀长度是否大于零。
  • 哦好吧好吧!我知道了。我现在就试试这个代码,我会告诉你它是否有效!
  • 没问题。祝你的编码冒险好运!
  • @AlexKim 你说得对,else 是多余的。但是从初学者的角度来看,理解代码流比随机返回要容易得多。性能也几乎没有差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多