sqlite3使用AND运算符执行SELECT查询无返回结果的问题
问题原因排查
- Python 逻辑运算符
or的求值不符合预期
非空字符串在Python中布尔值为True,你的lista[0]值为"David"属于真值,所以lista[0] or lista[1]的返回值固定为lista[0]也就是"David",不会触发取lista[1]的逻辑。最终拼接出来的实际执行SQL为:
你插入的测试数据里SELECT * FROM persoane WHERE nume = 'David' AND prenume = 'David'nume字段值为Mustea、prenume字段值为David,没有同时满足两个字段都为David的记录,自然没有查询结果。 - 业务逻辑与运算符使用不匹配
你想要实现的逻辑应该是nume匹配列表任意值且prenume匹配列表任意值,这类场景应该使用SQL的IN运算符,而不是在Python侧用or求值。 - 额外风险:f字符串拼接SQL存在SQL注入漏洞
直接将变量拼接入SQL语句会被恶意构造的字符串篡改SQL逻辑,必须使用SQLite参数化查询写法。
修复方案
方案1:严格匹配姓名顺序(nume为Mustea、prenume为David)
如果你的列表存储顺序为[prenume, nume],要严格对应字段顺序查询,写法如下:
import sqlite3 conn = sqlite3.connect("db_informatii_principal.db") c = conn.cursor() # 建表、插数据逻辑和之前一致 lista = ["David", "Mustea"] # 用?做占位符的参数化查询,按顺序传参 c.execute("SELECT * FROM persoane WHERE nume = ? AND prenume = ?", (lista[1], lista[0])) for x in c.fetchall(): print(x)
方案2:不匹配姓名顺序,只要两个字段分别在列表中存在
如果需要实现nume和prenume分别匹配列表任意值、不限制顺序,写法如下:
lista = ["David", "Mustea"] c.execute("SELECT * FROM persoane WHERE nume IN (?, ?) AND prenume IN (?, ?)", (lista[0], lista[1], lista[0], lista[1]))
内容的提问来源于stack exchange,提问作者David Mustea
相关产品推荐
相关产品推荐

