Python使用pd.read_sql从MS-SQL表批量查询值时遇URL解析错误
解决MS-SQL查询中IN子句参数传递的解析错误问题
这个错误的核心原因是你误解了pd.read_sql参数的作用——它的第二个参数是用来做参数化查询绑定的,不是直接替换SQL字符串的。你传入的new_string会被当成一个单独的参数值,而不是多个值的集合,导致SQL解析时把整个'2535488','2568394'当成一个格式错误的字符串,自然抛出解析异常。
下面给你两种可行的解决方案:
方法1:使用参数化查询(推荐,安全无注入风险)
参数化查询是处理这类问题的标准做法,我们可以先把要查询的值整理成纯值列表,再动态生成对应数量的MS-SQL占位符(?),最后通过参数绑定执行查询:
# 整理成不带引号的纯值列表 values_list = ['2535488', '2568394'] # 根据列表长度生成对应数量的占位符 placeholders = ', '.join(['?'] * len(values_list)) # 构造符合参数化要求的SQL语句 sql_query = f"""select * from my_table where my_col in ({placeholders})""" # 将列表作为params参数传入,pandas会自动完成参数绑定 data1 = pd.read_sql(sql_query, cnxn, params=values_list)
方法2:直接字符串格式化(不推荐,存在SQL注入风险)
如果你只是临时测试,不想调整代码结构,可以直接用字符串格式化把值拼进SQL语句里,但这种方式绝对不能用于生产环境,因为会引入严重的SQL注入漏洞:
new_string = "'2535488','2568394'" # 直接将字符串拼入SQL语句 sql_query = f"""select * from my_table where my_col in ({new_string})""" # 执行查询时无需传入额外参数 data1 = pd.read_sql(sql_query, cnxn)
补充说明:为什么直接写值进SQL能正常运行?
当你直接把值写进SQL语句时,IN ('2535488','2568394')是符合SQL语法的多值匹配写法;而用参数传递时,整个new_string被当成了一个单一的匹配值,相当于SQL实际执行的是my_col IN ('\'2535488\',\'2568394\''),这显然不符合你的查询需求,所以才会出现解析错误。
内容的提问来源于stack exchange,提问作者blackpanther05
相关产品推荐
相关产品推荐

