Python SQLite3中SELECT语句通配符与占位符结合的实现问题
解决SQLite3中LIKE查询结合通配符与参数占位符的问题
哦,我知道你卡在哪了!SQLite里字符串拼接根本不是用+的,它用的是||运算符,你原来的查询语句语法不对,自然查不到结果。这里有两种既安全又有效的解决办法:
方法1:在SQL语句中用||拼接通配符
直接在SQL里把%通配符和占位符用||连接起来,这样就能正确生成模糊匹配的条件,同时保持参数化查询的安全性:
list_of_genes = ["IFNL", "TMPT", "G6PD", "UGT1A1", ...] for gene in list_of_genes: sql.execute('''SELECT DISTINCT gene_symbol, haplo_function FROM Haplotypes WHERE gene_symbol LIKE '%' || ? || '%' ''', (gene,))
这种方式把模糊匹配的逻辑放在SQL层面,传入的参数还是纯基因名,完全避免了SQL注入的风险。
方法2:在Python中预处理参数,带上通配符
另一种更直观的方式是在Python代码里给每个基因名前后加上%,再传入SQL的占位符:
list_of_genes = ["IFNL", "TMPT", "G6PD", "UGT1A1", ...] for gene in list_of_genes: # 给基因名前后拼接通配符 query_gene = f"%{gene}%" sql.execute('''SELECT DISTINCT gene_symbol, haplo_function FROM Haplotypes WHERE gene_symbol LIKE ? ''', (query_gene,))
这种方式把通配符的处理放在Python端,SQL语句更简洁,同样能保证参数化查询的安全性,不会有注入风险。
注意事项
不管选哪种方法,都绝对不要直接把基因名拼进SQL字符串里(比如用f"LIKE '%{gene}%'"这种写法),那样会引入严重的SQL注入漏洞,参数化查询才是正确的做法。
内容的提问来源于stack exchange,提问作者Nulnulzeven
相关产品推荐
相关产品推荐

