使用PyMySQL操作MariaDB插入数据报1064 SQL语法错误求助
错误原因
- 你手动给SQL占位符
%s加了单引号:pymysql的参数化查询会自动为字符串类型的参数添加单引号、处理特殊字符转义,手动加引号会导致生成的SQL出现重复引号,比如name = '%s'传参后会变成name = ''park dong ju'',触发语法错误。 - 变量拼写错误:执行INSERT的代码中把变量
temp错写为tmep,会导致传参异常。 - 数据类型处理错误:
cursor.fetchone()返回的是元组类型,你直接转字符串会保留元组的括号、引号等冗余字符;同时n_route末尾多写了一个逗号,会被识别为单元素元组,直接和字符串拼接会导致内容异常。 - 字段名冲突:
time是SQL的保留关键字,直接作为字段名使用如果不加转义也可能触发语法错误。
修复方案
- 移除所有SQL占位符外侧的手动单引号,pymysql的参数化占位符直接写
%s即可,不需要包裹引号。 - 修正变量拼写错误,把
tmep改回temp。 - 正确处理查询结果和新路径的拼接,先取出元组中的路由字符串再拼接,同时去掉
n_route末尾多余的逗号。 - 对作为保留关键字的
time字段用反引号包裹转义。 - 优化查询逻辑,单次查询即可同时取出name和route字段,不需要两次执行查询。
修复后完整代码
import pymysql from datetime import datetime db = pymysql.connect(host="localhost", user="root", password="mariadb", charset="utf8") cursor = db.cursor() nm = 'park dong ju' temp = 36.5 n_route = '->podium' # 移除多余逗号,改为字符串类型 if nm != "" and temp != 0: cursor.execute("USE SD;") # 单次查询两个字段,占位符不加引号 select_sql = "SELECT name, route FROM PI WHERE name = %s" cursor.execute(select_sql, (nm,)) res = cursor.fetchone() db.commit() # 处理路由拼接,res不为空的话取第二个元素,为空的话用空字符串兜底 if res and res[1]: route = res[1] + n_route else: route = n_route current_time = datetime.now() # 占位符全部不加引号,time字段用反引号转义 insert_er = "INSERT INTO ER(name, temp, route, `time`) VALUES(%s, %s, %s, %s)" cursor.execute(insert_er, (nm, temp, route, current_time)) nm = "" temp = 0 db.commit() db.close()
内容的提问来源于stack exchange,提问作者Dongju
相关产品推荐
相关产品推荐

