Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将SQL参数with IN子句用于pyodbc的可变值数?_Python_Sql_Sql Server_Pyodbc - Fatal编程技术网

Python 如何将SQL参数with IN子句用于pyodbc的可变值数?

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” 我可以使用以下方法生成

我有一个要在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,文件
但如果我理解正确的话,这样做会使我面临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字符串格式,但这可能不是一条硬性规定。