pyodbc连接Access执行INSERT INTO语句报-3502语法错误
问题根因
这个报错和列数、占位符数量、传入参数数量没有关系,是你当前使用的Access ODBC驱动的解析缺陷导致的。
旧版Access ODBC驱动默认的SQL解析模式存在bug:哪怕你用方括号包裹了表名、列名这类标识符,只要标识符内部包含单引号、双引号这类特殊字符,解析器还是会错误截断语句,直接抛出INSERT INTO语法错误。你的表名GENERALITA' FERMATA包含单引号,列名Scritta gialla "bus"包含双引号,刚好触发了这个问题。
解决方案
以下方案都不需要修改现有数据库结构,按优先级测试即可:
- 首选方案:修改连接字符串,开启标准ANSI SQL解析模式,替换原连接串为以下写法:
conn_str = (r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=C:\temp\b.accdb;' r'ExtendedAnsiSQL=1;')
新增的ExtendedAnsiSQL=1参数会让驱动用标准ANSI SQL规则解析标识符,方括号内部的单引号、双引号都会被识别为标识符的正常组成部分,不会再出现语法误判。
- 如果上述方案不生效,先确认你安装的Access驱动版本:下载和你当前Python架构(32位/64位)匹配的最新版Microsoft Access Database Engine Redistributable安装包,替换系统自带的旧版驱动后再用上述连接串测试即可。
- 如果你没法更新驱动也不能修改连接参数,可以在Access数据库里新建一个查询(视图),起一个不带特殊字符的名字比如
GENERALITA_FERMATA_V,查询内容写:
SELECT * FROM [GENERALITA' FERMATA]
后续插入操作直接对这个视图执行即可,INSERT语句里的表名换成视图名,绕开驱动无法解析带单引号表名的bug,单表视图默认支持插入操作,不会影响数据写入。
快速排查技巧
如果调整后仍有报错,可以直接把打印出来的INSERT语句复制到Access本地的查询设计器SQL视图中,填入几个测试值运行,Access会直接高亮标红语法错误的具体位置,不需要盲猜问题点。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

