Python查询Access数据库SQL Where子句传字符串变量报错
MS Access Python参数化查询LIKE语法报错排查
两种错误写法的问题点
- 第一种
%s占位符写法报错核心原因:
Python连接MS Access常用的pyodbc、pypyodbc库走ODBC接口,Access ODBC不认%s这种占位符,必须用?作为参数占位符。 - 第二种
format拼接写法报错核心原因:
直接格式化字符串没有给传入的字符串值加单引号,最终拼出来的SQL是SELECT * FROM table1 WHERE table1.Itemname LIKE XYZ,数据库会把XYZ当成列名而不是字符串常量,直接触发语法错误。而且这种拼接写法有SQL注入风险,任何场景都不推荐用。
正确可运行写法
用Access兼容的?占位符做参数化查询即可,不需要手动加引号,驱动会自动处理字符串转义和包裹:
Itemname = "XYZ" # 占位符统一用? query = "SELECT * FROM table1 WHERE table1.Itemname LIKE ?" # 精确匹配XYZ直接传值即可 cursor2.execute(query, (Itemname,))
如果需要做模糊匹配(比如找所有Itemname包含XYZ的记录),直接在传参的时候拼接通配符就行,Access走ODBC连接时用标准SQL通配符%匹配任意长度字符、_匹配单个字符:
# 匹配包含XYZ的记录 cursor2.execute(query, (f"%{Itemname}%",)) # 匹配以XYZ开头的记录 # cursor2.execute(query, (f"{Itemname}%",))
补充:如果是完全匹配某个字符串,用
=运算符比LIKE查询效率更高,语句可以写成SELECT * FROM table1 WHERE table1.Itemname = ?,传参方式不变。
内容的提问来源于stack exchange,提问作者Ronak Patel
相关产品推荐
相关产品推荐

