在Python中的SELECT语句中传递列名

2024-10-01 15:41:00 发布

您现在位置:Python中文网/ 问答频道 /正文

    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()

这是我程序中的一段代码。我计划在查询中传递列名和参数。在

filters数组包含列名称,parameter数组包含参数。count是用户设置的筛选器数。过滤器和参数数组已经准备好了,没有问题。我只需要将它传递给查询以执行。这给了我一个错误“TypeError:function最多接受2个参数”


Tags: andfromexecute参数count数组allwhere
2条回答

不能使用SQL参数插入列名。你必须对这些部分使用经典的字符串格式。这就是SQL参数的;它们引用值,因此它们不可能被解释为SQL语句或对象名。在

下面,对列名使用字符串格式是可行的,但是要完全确定filters[0]值不是来自用户输入:

cursor.execute("SELECT * FROM PacketManager WHERE {} = ?".format(filters[0]), (parameters[0],))

您可能需要根据一组允许的列名验证列名,以确保不会发生注入。在

只能使用?设置参数,不能使用表名或列名。在

您可以使用预定义的查询构建dict。在

queries = {
    "foo": "SELECT * FROM PacketManager WHERE foo = ?",
    "bar": "SELECT * FROM PacketManager WHERE bar = ?",
    "foo_bar": "SELECT * FROM PacketManager WHERE foo = ? AND bar = ?",
}

# count == 1
cursor.execute(queries[filters[0], parameters[0])

# count == 2
cursor.execute(queries[filters[0] + "_" + queries[filters[1], parameters[0])

此方法将使您从filters[0]中的SQL注入中节省开支。在

相关问题 更多 >

    热门问题