Python Pyodbc查询失败,替换参数列表位于.join(['?',list])上

Python Pyodbc查询失败,替换参数列表位于.join(['?',list])上,python,python-3.x,pandas,sqlalchemy,pyodbc,Python,Python 3.x,Pandas,Sqlalchemy,Pyodbc,您好,我正在尝试将一个select查询从python运行到sql server。我只需要从脚本中的另一个函数的列表中选择特定的文件。我写这个函数就是为了: def flist_in_psumsdb(config, fnames_set_in_psumsdictlist): constring = config['db_string']['db_string'] cnxn = pyodbc.connect(constring) FilesToBeCrunched1000 = list(div_li

您好,我正在尝试将一个select查询从python运行到sql server。我只需要从脚本中的另一个函数的列表中选择特定的文件。我写这个函数就是为了:

def flist_in_psumsdb(config, fnames_set_in_psumsdictlist):
constring = config['db_string']['db_string']
cnxn = pyodbc.connect(constring)
FilesToBeCrunched1000 = list(div_list_into_chunks(list(fnames_set_in_psumsdictlist), 1000))
file_list = set()
for FilesChunks1000 in FilesToBeCrunched1000:
    values_string = ', '.join(['?' for item in FilesChunks1000])
    sqlstring = f"""SELECT LOG FROM {config['db_string']['bd_psums_meta_table']} WHERE LOG IN ({values_string})"""
    # print((FilesChunks1000))
    df = pd.read_sql_query(sqlstring,cnxn)
    file_list.update(set(df.LOG))
但是,当我运行脚本时,会出现以下错误:

 Execution failed on sql 'SELECT LOG FROM [NSGWSAINLINE].[dbo].[bd_psums_meta] WHERE LOG IN (?, ?, ?, ?, ?)
我打印了value字符串变量,它给了我以下信息:

?, ?, ?, ?, ?
现在这很奇怪,因为我认为这就是如何进行参数替换的联接。更奇怪的是,同样的结构适用于我编写的另一个函数,该函数用于从同一个表中删除重复项:

    for FilesChunks1000 in FilesToBeCrunched1000:
    values_string = ', '.join(['?' for item in FilesChunks1000])
    sqlstring = f"""DELETE FROM {config['db_string']['bd_psums_meta_table']} WHERE [LOG] IN ({values_string})"""
这个查询显然是有效的,尽管当我在这个函数中打印value_string时,它也会返回相同的查询结果

?, ?, ?, ?, ?

那么,是什么给出了?

您正在使用“?”参数,但没有在任何地方提供它们的值

试试这个

values_string = ', '.join(["?" for item in FilesChunks1000])
sqlstring = f"""SELECT LOG FROM {config['db_string']['bd_psums_meta_table']} WHERE LOG IN ({values_string})"""
df = pd.read_sql_query(sqlstring,cnxn, params=FilesChunks1000)
file_list.update(set(df.LOG))

您正在使用“?”参数,但未在任何位置提供其值

试试这个

values_string = ', '.join(["?" for item in FilesChunks1000])
sqlstring = f"""SELECT LOG FROM {config['db_string']['bd_psums_meta_table']} WHERE LOG IN ({values_string})"""
df = pd.read_sql_query(sqlstring,cnxn, params=FilesChunks1000)
file_list.update(set(df.LOG))

但是为什么它适用于我使用相同格式的另一个查询?这能防止sql注入吗?第二条语句可能会起作用,因为您可能已经执行了类似于cnxn.executesqlstrin、filechunks1000的sqlstring,因为这里也提供了值。对于df.read_sqlstring,您还没有提供文件名列表,我现在看到了,谢谢!您的方法是否能够抵御这些所谓的sql注入攻击?为了避免sql注入,您可以使用pd.read\u sql\u querysqlstring,cnxn,params=filechunks1000但为什么它适用于我使用相同格式的另一个查询?这是否可以防止sql注入?第二条语句可能会起作用,因为您可能已经执行了类似于cnxn.executesqlstrin、filechunks1000的sqlstring,因为这里也提供了值。对于df.read_sqlstring,您还没有提供文件名列表,我现在看到了,谢谢!您的方法是否可以防止这些所谓的sql注入攻击?为了避免sql注入,您可以使用pd.read_sql_querysqlstring,cnxn,params=FilesChunks1000