如何将参数化的sql查询放入变量然后在Python中执行?
- 2025-03-04 08:24:00
- admin 原创
- 75
问题描述:
我理解在 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)
解决方案 1:
以下是 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)
解决方案 2:
你很接近了。
sql_and_params = "INSERT INTO table VALUES (%s, %s, %s)", var1, var2, var3
cursor.execute(*sql_and_params)
星号表示该变量不被视为一个参数,而是解包为多个参数。
解决方案 3:
这对我有用。使用 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)
解决方案 4:
在 Python 中向 SQL 查询传递参数的最佳方式是:
"INSERT INTO table VALUES (:1, :2, :3) ", [val1, val2, val3]
或者另一个例子:
"UPDATE table T SET T.column2 = :1 where T.column1= :2 ", [val1,val2]
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD