当前位置: 首页 > 面试题库 >

内联列表以在python MySQLDB IN子句中使用

熊烨
2023-03-14
问题内容

我知道如何将列表映射到字符串:

foostring = ",".join( map(str, list_of_ids) )

而且我知道我可以使用以下命令将该字符串放入IN子句中:

cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))

我需要使用MySQLDB安全地完成同一件事(避免SQL注入)。在上面的示例中,由于foostring没有作为执行参数传递,因此它很容易受到攻击。我还必须在mysql库之外引用和转义。

(有一个相关的SO问题,但是那里列出的答案对MySQLDB不起作用或容易受到SQL注入的影响。)


问题答案:

list_of_ids直接使用:

format_strings = ','.join(['%s'] * len(list_of_ids))
cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                tuple(list_of_ids))

这样,您就不必引用自己的报价,并避免各种SQL注入。

请注意,数据(list_of_ids)作为参数直接进入mysql的驱动程序(不在查询文本中),因此没有注入。您可以在字符串中保留所需的任何字符,而无需删除或引用字符。



 类似资料:
  • 问题内容: MySql中有没有一种方法可以创建用于联接的内联表? 就像是: 那会输出 我可以在这样的联接中使用: 我意识到我可以做到 但这似乎很邪恶 我不想执行存储过程,因为在每次查询和数据大小上,a,b,c都可能发生变化。另外,存储过程也需要保存在数据库中,我不想只为此修改数据库。视图是一回事。 我真正想要的是使用更好的语法的东西。 问题答案: 我真正在寻找的是使用更好的语法执行SELECT 1

  • 问题内容: 哪种方法更好?使用元组,例如: 或清单,例如: 建议将哪一种用于此类用途,以及为什么使用(出于逻辑和性能考虑)? 问题答案: CPython解释器 将第二种形式替换为第一种形式 。 这是因为从常量加载元组是一个操作,但是列表将是3个操作;加载两个整数内容并构建一个新的列表对象。 由于您使用的是无法到达的列表文字,因此它将替换为元组: 这里第二字节码负载一个元组为常数,在 一个 步骤。将

  • 我正在尝试编写一个查询,其中我希望根据第一个连接条件选择WITHWHERE子句,并根据第二个连接条件选择第二个where子句。我用了几种方法编写了它,但它总是显示出一个错误: $user_id正在从其他地方获取。所以没有问题,如果我在这里运行一个连接,它工作正常。 我的问题是: 方法1: 方法二:

  • 问题内容: 我有这样的查询: 出现以下错误: 在MySql中,这是有效的,但显然在Postgresql中是无效的。据我所知,原因是查询部分的评估晚于该部分。是否有解决此问题的常用解决方法? 问题答案: 正如您所经历的那样,MySQL的支持是非标准的。正确的方法是重新打印SELECT子句中使用的相同表达式:

  • 问题内容: 我知道在oracle / mysql / sqlserver语句中,您不能在子句中引用列别名,因为它是在之前执行的,但它在sqlite3中有效: 为什么在sqlite中这有可能? 问题答案: 使用启用了标志的sqlite3 : 从上面的指令堆栈可以看出,行的循环(第8-23行)针对表中的每一行对子句中的每个表达式重复执行and命令。 因此,要回答我自己的问题,sqlite引擎能够通过在

  • 我正在尝试使用kotlin中的simplexml解析rss提要。 该订阅源是itunes的顶级播客订阅源 返回的数据具有以下结构: 我关心的部分是条目标签包含的播客列表。 我的模型类如下所示: 我有一个简单的单元测试,从文件中加载xml,将其传递给简单的exml反序列化器,然后将输出与一些预期的模型进行比较。 当我运行测试时,我得到一个异常: 向@ElementList注释中添加必需=false会