You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite查询报错:搜索值被识别为列名,如何修正?

解决SQLite查询中的no such column错误

错误原因

你直接将用户输入的字符串拼接进SQL语句,导致SQL解释器把搜索词(比如Mustang)当成了列名,而不是字符串值。生成的SQL语句实际是:

SELECT * FROM addresses WHERE last_name=Mustang

SQL会去查找名为Mustang的列,自然找不到,所以抛出OperationalError。同时这种拼接写法还存在SQL注入风险,属于不安全的编码方式。

修复方案:使用参数化查询

SQLite支持用?作为占位符,将查询参数单独传递给execute()方法,数据库会自动处理字符串的引号和转义,既避免语法错误,又能防范SQL注入。

修改查询函数中的执行语句:

# 替换原来的字符串拼接写法
c.execute("SELECT * FROM addresses WHERE last_name=?", (l_name.get(),))

注意:参数必须以元组形式传递,即使只有一个参数,也要在末尾加逗号((l_name.get(),)),确保它被识别为元组类型。

额外优化建议

  1. 查询操作不需要调用conn.commit(),commit仅用于增、删、改这类修改数据的操作。
  2. 每次搜索都创建新Label会导致界面标签叠加,可提前创建一个Label,通过textvariable属性动态更新内容,或者先销毁旧标签再创建新的:
def search():
    with sqlite3.Connection('address_book.db') as conn:
        c = conn.cursor()
        c.execute("SELECT * FROM addresses WHERE last_name=?", (l_name.get(),))
        records = c.fetchall()
    
    print_records = ""
    for record in records:
        print_records += f"{record[0]} {record[1]}\t{record[2]}\n"
    
    # 全局变量管理标签,避免重复创建
    global query_lbl
    if 'query_lbl' in globals():
        query_lbl.destroy()
    query_lbl = Label(root, text=print_records)
    query_lbl.grid(row=15, column=0, columnspan=2)
  1. 使用with语句管理数据库连接,能自动关闭连接和游标,避免手动关闭遗漏导致的资源占用。

内容的提问来源于stack exchange,提问作者Dallo81

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:31:03