Python Pyodbc 查询因 .join(['?', list]) 上的替换参数列表而失败
Python Pyodbc Query fails with substitution param list on .join(['?', list])
您好,我正在尝试 运行 来自 python 的 select 查询到 sql 服务器。我只需要 select 特定文件,这些文件来自脚本中另一个函数的列表。我为此编写了这个函数:
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 (?, ?, ?, ?, ?)
我打印了值字符串变量,它给了我这个:
?, ?, ?, ?, ?
现在这很奇怪,因为我认为这就是您为参数替换进行联接的方式。更奇怪的是,这个相同的结构适用于我编写的另一个函数,用于从相同的 table:
中删除重复项
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})"""
这个查询显然有效,虽然当我在这个函数中打印 values_string 时,它也 returns 与
相同的结果
?, ?, ?, ?, ?
那么有什么好处呢?
您正在使用“?”参数但不在任何地方提供它们的值
试试这个
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))
您好,我正在尝试 运行 来自 python 的 select 查询到 sql 服务器。我只需要 select 特定文件,这些文件来自脚本中另一个函数的列表。我为此编写了这个函数:
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 (?, ?, ?, ?, ?)
我打印了值字符串变量,它给了我这个:
?, ?, ?, ?, ?
现在这很奇怪,因为我认为这就是您为参数替换进行联接的方式。更奇怪的是,这个相同的结构适用于我编写的另一个函数,用于从相同的 table:
中删除重复项 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})"""
这个查询显然有效,虽然当我在这个函数中打印 values_string 时,它也 returns 与
相同的结果?, ?, ?, ?, ?
那么有什么好处呢?
您正在使用“?”参数但不在任何地方提供它们的值
试试这个
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))