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

Python SQL插入时遇TypeError: must be str, not int错误求助

解决SQL插入的TypeError及语法问题

问题根源

  1. SQL语法错误:你的insert语句格式错误,字段名position误用了单引号(应使用反引号或直接省略,因为它不是SQL关键字),且values`前多了一个逗号,导致语句本身无效。
  2. 类型拼接错误:position是整数类型,直接与字符串拼接会触发TypeError,即便用str()转换,也不是安全的处理方式。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:12:43