if count == 1:
cursor.execute("SELECT * FROM PacketManager WHERE ? = ?", filters[0], parameters[0])
all_rows = cursor.fetchall()
elif count == 2:
cursor.execute("SELECT * FROM PacketManager WHERE ? = ? AND ? = ?", filters[0], parameters[0], filters[1], parameters[1])
all_rows = cursor.fetchall()
elif count == 3 :
cursor.execute("SELECT * FROM PacketManager WHERE ? = ? AND ? = ? AND ? = ?", filters[0], parameters[0], filters[1], parameters[1], filters[2], parameters[2])
all_rows = cursor.fetchall()
这是我程序中的一段代码。我打算做的是在查询中传递列名和参数。
过滤器数组包含列名,参数数组包含参数。计数是用户设置的过滤器数量。过滤器和参数数组已经准备好了,没有问题。我只需要将它传递给查询即可执行。这给我一个错误“TypeError: function takes at most 2 arguments”
请您参考如下方法:
您不能使用 SQL 参数来插入列名。您必须对这些部分使用经典的字符串格式。这就是 SQL 参数的要点;它们引用值,因此它们不可能被解释为 SQL 语句或对象名称。
以下,对列名称使用字符串格式是可行的,但要100% 确定 filters[0] 值不是来自用户输入:
cursor.execute("SELECT * FROM PacketManager WHERE {} = ?".format(filters[0]), (parameters[0],))
您可能想要根据一组允许的列名验证列名,以确保不会发生注入(inject)。
