python - 如何在 pyodbc 中使用带有 IN 子句的 SQL 参数来获取可变数量的值?

标签 python sql sql-server pyodbc

我有一个值列表,我想在 IN 子句中使用这些值,以便使用 pyodbc 执行 SQL (SQL Server) 语句。示例:

files = ['file1', 'file2', ...]  # this list can have a variable number of elements
con = pyodbc.connect(...)

# What I'd like to do
result = con.cursor().execute('SELECT * FROM sometable WHERE file_name IN (?)', files)

但是,当我执行上面的语句时,出现如下错误:

ProgrammingError: ('The SQL contains 1 parameter markers, but 18 parameters were supplied', 'HY000')

我可以使用类似的东西生成可变参数字符串:

params = ','.join(['?']*len(files))
query = 'SELECT * FROM sometable WHERE file_name IN ({})'.format(params)
result = con.cursor().execute(query, files)

但如果我理解正确的话,这样做会使我面临 SQL 注入(inject)的风险。有没有办法安全地完成此操作?

最佳答案

您可以使用 JSON 将列表传递给 SQL Server。 EG

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)

关于python - 如何在 pyodbc 中使用带有 IN 子句的 SQL 参数来获取可变数量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57617437/

相关文章:

sql - 如何确保非负列?

python - Pandas:查找一列中存在重复值且第二列中存在不同值的行

mysql - MyBatis能否记录可以直接运行的完整SQL

mySQL 查询 : for a given typeId, 获取所有条目及其answerCount

SQL Server 创建用户定义的表类型时架构无法正常工作

sql-server - 以与 SSISDB 不同的用户身份执行 SSIS 包

python - 如何使用 Google Colab 在一夜之间训练我的模型?

javascript - 奇怪的 XPath 行为

用于检查 Namenode 状态的 Python 脚本

sql - 在函数 xp_dirtree 上传递变量时出错