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

制作EVE Online击杀板时SQLite查询特定词汇报‘无此列’错误

问题

正在为EVE Online制作击杀板,需要在SQLite数据库中搜索包含特定词汇的行。数据库列名如下:

  • id
  • final_blow_name
  • final_blow_ship_type
  • victim_name
  • victim_corporation
  • victim_birthday
  • victim_gender
  • victim_security_status
  • victim_ship_type
  • sistem_security_status
  • attackers_len

尝试用LIKE和WHERE语句查询时,出现no such column: 所搜索的名称错误,代码如下:

path = 'C:/Users/mrjol/PycharmProjects/myboard/board_veiw/database.db'
connection = sqlite3.connect(path)
cursor = connection.cursor()
search_request = str(request.session.pop('search_request', 'None'))
character_name_1 = search_request.partition(' ')[0]
character_name_2 = search_request.partition(' ')[2]
if character_name_2 != '':
    search_request = character_name_1 + '_' + character_name_2
search_answer = cursor.execute('SELECT final_blow_name FROM Killmails WHERE final_blow_name = Cosmo_Blink')
connection.close()
错误原因
  1. 字符串未加引号:SQL语句里的Cosmo_Blink没有用单引号包裹,SQLite会把它识别为列名而非字符串值,直接导致“找不到列”的错误。
  2. 硬编码搜索值:代码里直接把Cosmo_Blink写死在SQL中,完全没用到用户传入的search_request变量,等于没实现动态搜索逻辑。
  3. 不符合模糊搜索需求:你要的是“包含特定词汇”,但代码用了精确匹配的=,应该用LIKE配合通配符实现模糊匹配。
  4. 多余的空格处理:把用户输入的空格换成下划线的操作,会篡改原始搜索关键词,如果数据库中名称是带空格的,反而会搜不到正确结果。
解决方案

1. 核心修复:使用参数化查询

永远不要直接把用户输入拼到SQL语句里,既会引发语法错误,还可能导致SQL注入。用sqlite3的参数化查询,让数据库自动处理字符串转义。

2. 实现模糊搜索逻辑

用LIKE配合%通配符,%代表任意长度的任意字符,%关键词%就能匹配所有包含该关键词的行。

修正后的代码

path = 'C:/Users/mrjol/PycharmProjects/myboard/board_veiw/database.db'
connection = sqlite3.connect(path)
cursor = connection.cursor()

# 获取用户搜索请求,默认空字符串避免None问题
search_request = str(request.session.pop('search_request', '')).strip()

results = []
if search_request:
    # 参数化查询,?是占位符,后面元组传入带通配符的搜索值
    cursor.execute(
        'SELECT final_blow_name FROM Killmails WHERE final_blow_name LIKE ?',
        (f'%{search_request}%',)
    )
    # 获取查询结果
    results = cursor.fetchall()
else:
    # 处理空搜索的情况,比如返回所有数据或提示无输入
    cursor.execute('SELECT final_blow_name FROM Killmails')
    results = cursor.fetchall()

connection.close()

额外说明

  • 如果确认数据库中的名称是用下划线替代空格的,可把f'%{search_request}%'改成f'%{search_request.replace(" ", "_")}%',替换用户输入的空格后再搜索。
  • 必须调用fetchall()/fetchone()等方法才能拿到查询结果,cursor.execute()仅返回游标对象,不会直接输出数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:42:46