You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:48:03