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
相关产品推荐
相关产品推荐

