制作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()
错误原因
- 字符串未加引号:SQL语句里的
Cosmo_Blink没有用单引号包裹,SQLite会把它识别为列名而非字符串值,直接导致“找不到列”的错误。 - 硬编码搜索值:代码里直接把
Cosmo_Blink写死在SQL中,完全没用到用户传入的search_request变量,等于没实现动态搜索逻辑。 - 不符合模糊搜索需求:你要的是“包含特定词汇”,但代码用了精确匹配的
=,应该用LIKE配合通配符实现模糊匹配。 - 多余的空格处理:把用户输入的空格换成下划线的操作,会篡改原始搜索关键词,如果数据库中名称是带空格的,反而会搜不到正确结果。
解决方案
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
相关产品推荐
相关产品推荐

