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

时间:2009-10-27 20:02:48

标签: python sql

我知道在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)

4 个答案:

答案 0 :(得分:14)

这是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_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)

答案 1 :(得分:4)

你非常接近。

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

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

答案 2 :(得分:0)

你可以试试这个:

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

但我不确定这是不是你要找的东西。这取决于您是否希望将值作为变量的一部分。如果你这样做,Ants Aasma的回答可能是正确的。

答案 3 :(得分:0)

这对我有用。使用pyodbc查询Microsoft SQL Server。

cusotmer_list = ['ABC', '123']

# parameterized query placeholders
placeholders = ",".join("?" * len(customer_list))

# query table
query = 
"""
SELECT
[ID],
[Customer]
FROM xyz.dbo.abc
WHERE [Customer] IN (%s)
""" % placeholders

# read query results in pandas dataframe
df = pd.read_sql(sql=query, con=cnxn, params=customer_list)