【问题标题】:Variables in a SQL table update for a discord.py botdiscord.py 机器人的 SQL 表中的变量更新
【发布时间】:2020-04-23 00:59:19
【问题描述】:

我正在构建一个连接到 PostgreSQL 数据库的 Discord 机器人(使用 discord.py)。

我有多个表,所有表名都存储在名为TableNames 的字符串列表中。

当我直接使用表名时,像这样:

await self.bot.ARC.execute("UPDATE utah SET utah = $1 WHERE user_id = $2", True, message.author.id)

一切正常。

但是当我尝试将表名设置为变量时,像这样:

wait self.bot.ARC.execute("UPDATE $1 SET $2 = True WHERE user_id = $3", 'utah', 'utah', message.author.id)

我收到一条错误消息,提示我在 $1 上有语法错误。

我可以将表名设置为变量而不出现语法错误吗?如果是这样,我该怎么做?

【问题讨论】:

  • 您不能将表名作为查询参数传递,因为您的 RDBMS 必须能够在执行之前从查询字符串中准备查询。

标签: python sql postgresql discord.py


【解决方案1】:

如果您知道您的字符串列表 TableNames 包含安全输入(或不包含任何用户输入),您可以直接在 Python 中为相关子字符串格式化查询字符串,例如表名,在传递给execute之前。

否则,您可能需要执行dynamic query/command using PL/pgSQL

【讨论】:

    【解决方案2】:

    现在我已经用一个沉重的清单来解决我的问题:

    user = await self.bot.ARC.fetch(Globals.FetchARCDB[Globals.Dinosaurs.index(Dino)], member.id)
    

    Globals.FetchARCDB[Globals.Dinosaurs.index(Dino)] 等于 "UPDATE utah SET utah = $1 WHERE user_id = $2"

    这可行,但需要一个非常大的列表,需要手动设置(使用循环但仍然非常糟糕......)

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2021-06-12
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多