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

Python写入MySQL报错TypeError:'str'对象不可调用求助

解决SQL语句拼接时的TypeError: 'str'对象不可调用异常

嘿,这个问题很典型,我一眼就瞅出问题所在了——你在构造SQL语句的时候犯了个语法小错误!

错误原因分析

你看这段代码:

sql = ("""INSERT INTO `TAB_TEMP` (`Date`,`Time`,`JX`,`JY`,`JZ`,`IX`,`IY`,`IZ`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"""(Date,Time,accel_data['x'],accel_data['y'],accel_data['z'],gyro_data['x'],gyro_data['y'],gyro_data['z']))

这里你把SQL字符串直接跟参数元组(Date,...)连在一起了,Python会把前面的字符串当成函数来调用,而字符串根本不是可调用对象,自然就抛出TypeError: 'str' object is not callable的异常了。

另外还有两个小坑你没注意到:

  1. 代码里用到了accel_data,但你只获取了gyro_data,没调用mpu.get_accel_data(),运行时会报NameError;
  2. 每次循环都重新实例化MPU6050,这完全没必要,会浪费传感器资源;
  3. 执行SQL后没提交事务,数据根本不会写入数据库。

修复方案(两种方式,推荐第二种)

方式1:修正字符串格式化语法

在SQL字符串和参数元组之间加上%操作符,这是Python传统的字符串格式化方式:

# 先补上加速度数据的获取
accel_data = mpu.get_accel_data()
# 正确的格式化写法
sql = """INSERT INTO `TAB_TEMP` (`Date`,`Time`,`JX`,`JY`,`JZ`,`IX`,`IY`,`IZ`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)""" % (Date, Time, accel_data['x'], accel_data['y'], accel_data['z'], gyro_data['x'], gyro_data['y'], gyro_data['z'])
cursor.execute(sql)

方式2:使用参数化查询(强烈推荐)

直接把参数作为execute()的第二个参数传入,这种方式不仅能避免语法错误,还能防止SQL注入攻击,是数据库操作的最佳实践:

accel_data = mpu.get_accel_data()
# 只定义SQL模板,参数用%s占位
sql = """INSERT INTO `TAB_TEMP` (`Date`,`Time`,`JX`,`JY`,`JZ`,`IX`,`IY`,`IZ`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"""
# 参数单独作为元组传入execute
cursor.execute(sql, (Date, Time, accel_data['x'], accel_data['y'], accel_data['z'], gyro_data['x'], gyro_data['y'], gyro_data['z']))

完整修正后的代码

import time
# 导入你用到的传感器库和MySQL连接库,比如pymysql

# 把传感器初始化放到循环外面,避免重复初始化
mpu = MPU6050(0x68)

# 假设你已经完成数据库连接初始化
# conn = pymysql.connect(host='你的主机', user='用户名', password='密码', db='数据库名')
# cursor = conn.cursor()

while True:
    gyro_data = mpu.get_gyro_data()
    accel_data = mpu.get_accel_data()  # 补上加速度数据获取
    print(f"陀螺仪数据:X={gyro_data['x']}, Y={gyro_data['y']}, Z={gyro_data['z']}")
    
    current_time = time.strftime("%H:%M:%S")
    current_date = time.strftime("%Y-%m-%d")
    print(f"当前时间:{current_time} - {current_date}")
    
    # 使用参数化查询
    sql = """INSERT INTO `TAB_TEMP` (`Date`,`Time`,`JX`,`JY`,`JZ`,`IX`,`IY`,`IZ`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"""
    params = (current_date, current_time, accel_data['x'], accel_data['y'], accel_data['z'], gyro_data['x'], gyro_data['y'], gyro_data['z'])
    cursor.execute(sql, params)
    
    conn.commit()  # 必须提交事务,数据才会写入数据库
    time.sleep(1)  # 加个延时,避免每秒插入大量数据

内容的提问来源于stack exchange,提问作者Mehmet Ali Küçük

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:03