如何修复Python SQLite查询赛事与轮次ID时的字符串拼接类型错误
问题修复方案
错误原因
- 你的
getIDCampionato函数返回值是列表(代码中用列表推导式[row[0] for row in cursor]生成),哪怕查询结果只有1条,返回的也是类似[435]的列表结构。你把这个列表直接作为参数传给getIDGiornata的id_campionato形参,在拼接SQL时试图将列表和字符串相加,自然触发TypeError: can only concatenate str (not "list") to str报错。 - 你当前直接用
+拼接SQL语句的写法存在SQL注入风险,且如果赛事名包含引号会直接触发SQL语法错误,应该用SQLite官方推荐的参数化查询写法。 getIDGiornata函数当前查询的是Numero_Giornata字段(也就是轮次数字),但你实际需要存入结果表的是轮次的主键ID_Giornata,逻辑上存在错误。
修改后的代码
def getIDCampionato(nome_campionato): # 使用参数化查询,? 作为占位符,参数以元组形式传入 cursor.execute('SELECT ID_Campionato FROM ARCHIVIO_Campionati WHERE Nome_Campionato = ?;', (nome_campionato,)) result = cursor.fetchone() # 只取第一条匹配结果,返回元组,无匹配则为None return result[0] if result else None def getIDGiornata(id_campionato, giornata): # 注意这里查询字段改为ID_Giornata,符合存入结果表的需求,轮次字段为整数类型,提前做类型转换 cursor.execute('SELECT ID_Giornata FROM ARCHIVIO_Giornate WHERE Relaz_Campionato = ? AND Numero_Giornata = ?;', (id_campionato, int(giornata))) result = cursor.fetchone() return result[0] if result else None
补充说明
可以在add_employee函数的空值校验逻辑中,增加对id_camp和id_giornata是否为None的判断,避免查询不到对应ID时存入无效值,比如在校验条件中补充or id_camp is None or id_giornata is None即可。
内容的提问来源于stack exchange,提问作者William50694
相关产品推荐
相关产品推荐

