pyodbc连接Access执行DELETE报Too few parameters错误如何解决
解决方案
方案1:使用参数化查询(推荐)
这是最优解,完全不需要处理引号转义问题,同时可以避免SQL注入风险,适配所有含特殊字符的取值场景。
pyodbc执行参数化语句时,使用?作为占位符,将参数值按顺序放在execute方法的第二个参数位置即可,示例代码如下:
import pyodbc # 连接数据库 conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\XXX\Database.accdb;') curs = conn.cursor() # 待匹配的姓氏,支持含单引号的取值,比如x'xxx'x target_last_name = "x'xxx'x" # SQL语句使用?作为参数占位符,不需要加任何引号包裹 query_del = "DELETE * FROM Students WHERE Students.[last_name] = ?" # 执行时传入参数,放在元组中传递(单参数末尾要加逗号,避免被识别为字符串序列) curs.execute(query_del, (target_last_name,)) curs.commit() conn.close()
方案2:手动转义单引号(仅适合特殊场景)
如果确实需要拼接SQL字符串,可以把取值中的单引号替换为两个连续的单引号,Access SQL会将其识别为单个单引号字符,不会触发语法错误:
target_last_name = "x'xxx'x" # 转义处理:将单引号替换为两个单引号 escaped_name = target_last_name.replace("'", "''") query_del = f"DELETE * FROM Students WHERE Students.[last_name] = '{escaped_name}'"
问题原因说明
你遇到的双引号执行报错是因为Access ODBC驱动的默认配置中,双引号被用于包裹表名、列名这类标识符,而非字符串值,因此你用双引号包裹Q时,驱动会把Q识别为未传入的参数,才抛出Too few parameters. Expected 1的错误。
内容的提问来源于stack exchange,提问作者Anabel
相关产品推荐
相关产品推荐

