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的异常了。
另外还有两个小坑你没注意到:
- 代码里用到了
accel_data,但你只获取了gyro_data,没调用mpu.get_accel_data(),运行时会报NameError; - 每次循环都重新实例化
MPU6050,这完全没必要,会浪费传感器资源; - 执行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
相关产品推荐
相关产品推荐

