Python 如何将SQL参数with IN子句用于pyodbc的可变值数?
我有一个要在in子句中使用的值列表,用于使用pyodbc执行SQL Server语句。例如: files=['file1','file2',…]此列表可以包含数量可变的元素 con=pyodbc.connect。。。 我想做什么 结果=con.cursor.执行'SELECT*FROM sometable WHERE file_name IN',files 但是,当我执行上述语句时,会出现如下错误: 编程错误:“SQL包含1个参数标记,但提供了18个参数”,“HY000” 我可以使用以下方法生成可变参数字符串: 参数=','。连接['?']*文件 query='SELECT*FROM sometable,其中文件名位于{}'。formatparams 结果=con.cursor.executequery,文件Python 如何将SQL参数with IN子句用于pyodbc的可变值数?,python,sql,sql-server,pyodbc,Python,Sql,Sql Server,Pyodbc,我有一个要在in子句中使用的值列表,用于使用pyodbc执行SQL Server语句。例如: files=['file1','file2',…]此列表可以包含数量可变的元素 con=pyodbc.connect。。。 我想做什么 结果=con.cursor.执行'SELECT*FROM sometable WHERE file_name IN',files 但是,当我执行上述语句时,会出现如下错误: 编程错误:“SQL包含1个参数标记,但提供了18个参数”,“HY000” 我可以使用以下方法生成
但如果我理解正确的话,这样做会使我面临SQL注入的风险。有没有办法安全地完成此任务?您可以使用JSON将列表传递给SQL Server。乙二醇
import numpy as np
import pandas as pd
import pyodbc
import json
files = ['file1', 'file2', 'file3'] # this list can have a variable number of elements
json_files = json.dumps(files)
print(json_files)
conn = pyodbc.connect('Driver={Sql Server};'
'Server=localhost;'
'Database=tempdb;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
cursor.execute("create table #sometable(id int, file_name varchar(255)); insert into #sometable(id,file_name) values (1,'file2')")
# What I'd like to do
result = cursor.execute('SELECT * FROM #sometable WHERE file_name IN (select value from openjson(?))', json_files)
rows = cursor.fetchall()
print(rows)
这样做会使我面临SQL注入的风险
不,它不会,因为您可以完全控制注入SQL命令文本的内容,即逗号分隔的问号字符串。如果您的列表中包含的项目不超过大约2100个,那么您的方法很好。如果您有一个兼容级别为130或更高的数据库,那么这是一个很好的技巧。是的。Python数据访问库不是最好的,SQL Server JSON功能填补了大量空白,如大容量插入、表值参数、成形数据检索和对象映射。您的尝试没有SQL注入风险。您仅在生成带有动态参数占位符的准备好的语句。但是你在execute中绑定了值。啊,我明白了。似乎建议一般不要使用Python字符串格式,但这可能不是一条硬性规定。