为何SQLite中同结构函数同类型查询一个有结果一个无结果?
问题原因与解决方案
问题出在SQL参数的传递方式上:
cursor.execute()的第二个参数需要是序列类型(比如元组、列表),每个元素对应SQL语句中的一个占位符。但你的代码里直接传递了字符串,这会导致两种问题:
- 若参数是多位数的数字(比如
stan_id=123),字符串会被拆分为单个字符序列('1'、'2'、'3'),与SQL中的单个占位符不匹配; - 即使参数是单字符,将整数转成字符串传入,可能与数据库中
ulaz_id的整数类型产生隐式转换问题,导致匹配不到数据。
修复后的代码
将两个函数的cursor.execute调用改为传递元组参数,并且不需要手动转成字符串:
修正后的selectAll函数(规范写法)
def selectAll(predstavnik_id): q = "SELECT * FROM ulaz WHERE predstavnik_id = (?)" cursor.execute(q, (predstavnik_id,)) # 改为元组格式 rows = cursor.fetchall() return rows if rows else None
修正后的selectStanByUlaz函数
def selectStanByUlaz(stan_id): q = "SELECT * FROM stan WHERE ulaz_id = (?)" cursor.execute(q, (stan_id,)) # 改为元组,无需转字符串 rows = cursor.fetchall() return rows if rows else None
补充说明
- SQLite会自动处理参数的类型转换,不需要手动将整数转成字符串;
- 元组写法要注意末尾的逗号:
(stan_id,),少了逗号会被当成普通括号包裹,而非元组; - 你在SQLite Studio中能正常查询,是因为手动输入的参数类型与数据库字段匹配,而代码中错误的参数传递方式破坏了这种匹配。
内容的提问来源于stack exchange,提问作者zlocko
相关产品推荐
相关产品推荐

