Python SQL插入时遇TypeError: must be str, not int错误求助
解决SQL插入的TypeError及语法问题
问题根源
- SQL语法错误:你的insert语句格式错误,字段名
position误用了单引号(应使用反引号或直接省略,因为它不是SQL关键字),且values`前多了一个逗号,导致语句本身无效。 - 类型拼接错误:
position是整数类型,直接与字符串拼接会触发TypeError,即便用str()转换,也不是安全的处理方式。 - SQL注入风险:直接将变量拼接进SQL语句,存在严重的安全漏洞。
正确解决方法(推荐参数化查询)
不要手动拼接SQL,使用数据库驱动支持的参数化查询,既能解决类型问题,又能避免注入风险:
修改代码如下:
position = x + int(w/2) if position > 320: # 用参数占位符替代字符串拼接,数据库自动处理类型转换 insertrec.db.execute("INSERT INTO position (position) VALUES (?)", (position,)) insertrec.db.commit() print(klar) insertrec.db.close() # 原pos函数可直接删除,无需保留
- 占位符
?适用于SQLite,若使用MySQL需替换为%s,不同数据库占位符格式略有差异,以对应驱动文档为准。 - 第二个参数必须是元组,即使只有一个值,也要加逗号确保格式正确。
若坚持使用字符串拼接(不推荐)
如果一定要保留pos函数,需同时修正语法和类型转换:
def pos(position): # 修正SQL语法,将position转为字符串后插入 sqlquery = "INSERT INTO position (position) VALUES ('{}')".format(str(position)) return sqlquery
但这种方式仍存在SQL注入风险,禁止在生产环境使用。
额外注意事项
db.close()放在当前位置可能导致后续数据库操作失败,建议使用上下文管理器with自动管理连接生命周期。- 变量名
sqlcuery为拼写错误,规范命名应为sqlquery,虽不影响运行,但建议修正以提升代码可读性。
内容的提问来源于stack exchange,提问作者user19956518
相关产品推荐
相关产品推荐

