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

Python3向MySQL插入推特数据时触发TypeError: 'str' object is not callable

解决TypeError: 'str' object is not callable错误

嘿,这个错误其实是个很容易踩的语法小坑,咱们马上就能搞定它!

错误根源

你出错的代码行是这里:

cur.execute("INSERT INTO tweet (textt) VALUES (%s)" (tweet))

Python看到字符串后面直接跟了(tweet),会误以为你想把这个字符串当作函数来调用,但字符串本身并不是可调用的对象,所以就抛出了TypeError: 'str' object is not callable这个错误。

正确的写法

推荐方式(参数化查询,防SQL注入)

pymysql的execute方法支持把参数作为第二个参数传入,这种方式既安全又能避免语法错误:

cur.execute("INSERT INTO tweet (textt) VALUES (%s)", (tweet,))

⚠️ 注意:这里的(tweet,)末尾的逗号不能省略,否则Python会把它当成普通括号包裹的变量,而不是元组。

不推荐的字符串格式化方式(有SQL注入风险)

如果你一定要用字符串拼接,得用%操作符,而不是直接加括号:

cur.execute("INSERT INTO tweet (textt) VALUES (%s)" % (tweet,))

但这种方式存在SQL注入的安全隐患,所以强烈建议用第一种参数化的写法。

额外的优化建议

还有两个小细节需要注意,不然数据可能不会正确写入数据库:

  • 执行插入后需要手动提交事务:在cur.execute(...)之后加上conn.commit(),因为pymysql默认是手动提交模式。
  • 全局游标变量的问题:当前代码里cur是全局变量,虽然能运行,但更好的做法是把数据库连接/游标传入listener类,避免全局变量带来的潜在问题。

修正后的代码片段

修改后的on_data方法:

def on_data(self, data):
    all_data = json.loads(data)
    tweet = all_data["text"]
    # 修正execute的参数传递方式
    cur.execute("INSERT INTO tweet (textt) VALUES (%s)", (tweet,))
    # 提交事务,确保数据写入数据库
    conn.commit()
    print(tweet)
    return True

内容的提问来源于stack exchange,提问作者Amzar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:51:46