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

标签 python sql

我理解在 Python 中格式化 sql 查询的正确方法是这样的:

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

这样它就可以防止sql注入(inject)。我的问题是是否有办法将查询放入变量然后执行它?我尝试了下面的示例,但收到错误消息。可以这样做吗?

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

最佳答案

这是 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.

因此执行最多需要 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_and_params 扩展为 4 个参数(同样,只执行 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)

关于python - 如何将参数化的sql查询放入变量然后在Python中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1633332/

相关文章:

python - Pytorch 中的批量学习是如何进行的?

python - 将 Wagtail 与 Django 管理集成

python - 如何使用特定的 HostkeyAlgorithms 配置 pysftp/paramiko 连接 - python

MySQL 将日期范围转换为单行/每年的计数天数?

SQL - 避免自连接/内部连接上的重复对?

python - 有没有办法自动激活 virtualenv 作为 docker 入口点?

python - 为什么即使条件为真,这个循环也会中断?

sql - 如何使用 100 条记录的表中每一行的不同值更新表中所有行的列

mysql - 添加列并更改表错误

sql - 像外键一样,如何使用oracle引用同一表中的另一个列值?