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

使用PyMySQL操作MariaDB插入数据报1064 SQL语法错误求助

错误原因

  • 你手动给SQL占位符%s加了单引号:pymysql的参数化查询会自动为字符串类型的参数添加单引号、处理特殊字符转义,手动加引号会导致生成的SQL出现重复引号,比如name = '%s'传参后会变成name = ''park dong ju'',触发语法错误。
  • 变量拼写错误:执行INSERT的代码中把变量temp错写为tmep,会导致传参异常。
  • 数据类型处理错误:cursor.fetchone()返回的是元组类型,你直接转字符串会保留元组的括号、引号等冗余字符;同时n_route末尾多写了一个逗号,会被识别为单元素元组,直接和字符串拼接会导致内容异常。
  • 字段名冲突:time是SQL的保留关键字,直接作为字段名使用如果不加转义也可能触发语法错误。

修复方案

  1. 移除所有SQL占位符外侧的手动单引号,pymysql的参数化占位符直接写%s即可,不需要包裹引号。
  2. 修正变量拼写错误,把tmep改回temp。
  3. 正确处理查询结果和新路径的拼接,先取出元组中的路由字符串再拼接,同时去掉n_route末尾多余的逗号。
  4. 对作为保留关键字的time字段用反引号包裹转义。
  5. 优化查询逻辑,单次查询即可同时取出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:27:04