Python3调用sqlite3执行LIKE查询无返回结果的问题排查与解决
环境说明
- Python版本:3.8.10
- 依赖模块:sqlite3
- 运行环境:Ubuntu 20.04.3 LTS,内核版本5.4.0-90-generic x86_64
数据库说明
当前操作的数据库表结构如下,无权限修改库结构及内部存储数据:
| 字段名 | 类型 | 说明 |
|---|---|---|
id | INTEGER | 主键 |
parent_id | INTEGER | 父级ID |
key | TEXT | 键名 |
type | INTEGER | 类型 |
value | TEXT | 值 |
示例记录:1250 | 1156 | TicketsLeft | 6 | 10
初始代码与问题
需求为根据指定key查询对应的value,不需要使用模糊匹配占位符%,初始实现代码如下:
#!/usr/bin/python3 import sqlite3 TextA= 'TextInDb' def query_named(key_in_db): con = sqlite3.connect("DBNAME.db") cur = con.cursor() cur.execute('SELECT value FROM DBNAME WHERE key LIKE ?', ("%{}%".format(key_in_db),)) records = cur.fetchall() print(records) for row in records: print(row) con.close() return records print(query_named(TextA))
执行代码后返回空数组[]。经过基础验证:
- 在当前Python环境执行按ID查询的SQL
SELECT value FROM DBNAME WHERE id = 1234可以正常拿到结果 - 按
key字段匹配的SQL执行后均返回空 - 相同SQL在DB Browser工具中可以正常执行拿到预期结果
测试验证
针对key匹配问题做了多轮测试:
- 执行
cur.execute('SELECT value FROM DBNAME WHERE key LIKE ?', ("{}".format('TicketsLeft'),)),返回空数组 - 执行
cur.execute('SELECT value FROM DBNAME WHERE key = ?', ('TicketsLeft',)),返回空数组 - 执行
cur.execute('SELECT value FROM DBNAME WHERE key = "TicketsLeft"'),返回空数组 - 执行
cur.execute("SELECT value FROM DBNAME WHERE key = 'TicketsLeft'"),返回空数组 - 执行
cur.execute("SELECT * FROM DBNAME WHERE id = 1250"),正常返回[('4',)]
解决方案
问题根因为存储的key字段首尾存在不可见空白字符,使用SQLite内置的TRIM()函数清理key字段的首尾空白后即可正常匹配,修复后可用代码如下:
#!usr/bin/python3 import sqlite3 TextA = 'SomeText' def query_named(key_in_db): con = sqlite3.connect("DBNAME.db") cur = con.cursor() cur.execute("SELECT value FROM DBNAME WHERE TRIM(key) = ?", (key_in_db,)) records = cur.fetchall() print(records) for row in records: print(row) con.close() return records print(query_named(TextA))
内容的提问来源于stack exchange,提问作者Oxieth
相关产品推荐
相关产品推荐

