Python操作SQLite按已获取影片ID查询film表信息失败如何解决?
问题排查与修复方案
核心问题点
c.fetchall()返回的是嵌套元组列表,即使只查询单个字段,每个结果项都是单元素元组(如(1,)),而非直接的ID数值,无法直接作为查询条件使用- 循环内的SQL语句错误写死了匹配值
'a',没有引用循环变量a,同时未使用参数化查询的规范写法,导致查询条件完全不符合预期
修复后的代码
import sqlite3 # 连接数据库 conn = sqlite3.connect('sakila.db') c = conn.cursor() # 检查数据库连接状态 if conn: print("Connection successful") else: print("Connection unsuccessful") kategorija = input("Enter the category: ") c.execute("SELECT DISTINCT FID FROM film_list WHERE category=?", (kategorija,)) # 提取纯ID列表,解决嵌套元组问题 filmid_list = [item[0] for item in c.fetchall()] print(filmid_list) result = [] for fid in filmid_list: # 使用参数化查询传入ID,不写死条件、不手动拼接字符串 c.execute("SELECT title,release_year FROM film WHERE film_id = ?", (fid,)) result.append(c.fetchone()) print(result)
优化方案(可选,性能更高)
无需循环多次查询数据库,可直接用联表查询一次性拿到所有需要的结果,减少数据库IO开销:
import sqlite3 conn = sqlite3.connect('sakila.db') c = conn.cursor() kategorija = input("Enter the category: ") c.execute(""" SELECT DISTINCT f.title, f.release_year FROM film f JOIN film_list fl ON f.film_id = fl.FID WHERE fl.category = ? """, (kategorija,)) result = c.fetchall() print(result)
内容的提问来源于stack exchange,提问作者Dmitreeey
相关产品推荐
相关产品推荐

