SQLite中使用?占位符的LIKE语句实现电影标题子串匹配的问题
错误写法的核心问题
- 带
%?%的查询失效原因:Python DB-API规范下的*?*占位符是独立的参数值位置标记,不能被SQL层的通配符%直接包裹在查询字符串中,数据库解析时会将%?%判定为非法语法,无法正确关联传入的参数。 - 直接字符串拼接的问题:将命令行输入直接拼接到SQL字符串中,完全丧失参数化查询防SQL注入的安全优势,一旦输入内容包含单引号、转义特殊字符,会直接触发SQL语法报错,稳定性极差。
可用的正确实现
将通配符%拼接到传入查询的关键词变量中,查询语句内仅保留独立的参数占位符即可:
# 为关键词拼接前后匹配通配符 match_cond = f"%{sys.argv[1]}%" query = "SELECT m.year FROM movie m WHERE m.title LIKE ?" cur.execute(query, (match_cond,))
补充:如果需要实现不区分大小写的子串匹配,可根据所用数据库追加排序规则,例如SQLite环境下可改写查询为
SELECT m.year FROM movie m WHERE m.title LIKE ? COLLATE NOCASE。
内容的提问来源于stack exchange,提问作者Michael Qiao
相关产品推荐
相关产品推荐

