如何将参数化的sql查询放入变量,然后在Python中执行?

2024-04-26 11:07:58 发布

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

我知道在Python中格式化sql查询的正确方法如下:

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3)

从而防止sql注入。我的问题是,是否有方法将查询放入变量中,然后执行它?我尝试了下面的示例,但收到一个错误。有可能这样做吗?

sql="INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(sql)

Tags: 方法示例executesql错误tablecursorinsert
2条回答

你很接近。

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(*sql_and_params)

星号表示变量不被视为一个参数,而是被解压成许多参数。

这是cursor.execute的调用签名:

Definition: cursor.execute(self, query, args=None)

    query -- string, query to execute on server
    args -- optional sequence or mapping, parameters to use with query.

因此execute最多需要3个参数(args是可选的)。 如果给定args,则它应该是一个序列。 所以

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(*sql_and_params)

不会起作用的,因为

cursor.execute(*sql_and_params)

将元组sql_和_params展开为4个参数(同样,execute只需要3个参数)。

如果你真的必须使用

sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3

当你把它喂给cursor.execute时,你必须把它分开:

cursor.execute(sql_and_params[0],sql_and_params[1:])

但我觉得用两个变量更让人愉快:

sql = "INSERT INTO table VALUES (%s, %s, %s)"
args= var1, var2, var3
cursor.execute(sql, args)

相关问题 更多 >