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

Python字典插入MariaDB报Error 1064语法错误原因排查

MariaDB 1064语法报错原因定位

核心报错原因

你直接通过f-string把Python列表的原生字符串表示拼接到SQL语句中,生成的内容完全不符合MariaDB的SQL语法规范,具体问题如下:

  • 列名段完全非法:SQL的INSERT语法要求列名部分必须是圆括号()包裹的、和表结构一致的列名序列,例如(col1, col2, col3)。但你把存储所有文件名的Python列表直接转成字符串拼接,生成的内容是带方括号[]、单引号的Python列表格式(即报错提示里的['158795_1635509614542_20211029151335135_27.1943_38.4319.jpg', ...]),解析器读到开头的[就直接判定语法错误。
  • 字段映射完全错误:你的建表语句中,非自增字段为id_key/name/date/sample/coord_y/coord_x/created,但你完全没有按照表结构传对应字段:
    • 字典的键是文件名,应该对应id_key字段
    • 字典值拆分出的5个属性,分别对应name/date/sample/coord_y/coord_x
    • 非空字段created你没有传任何值
  • 值段格式非法:SQL多行插入要求VALUES后是多组圆括号包裹的行值,例如(v1,v2,v3),(v4,v5,v6),你直接拼接Python嵌套列表的字符串表示,既没有行级圆括号,也没有做特殊字符转义,完全不符合语法。
  • 存在严重安全隐患:直接f-string拼接外部传入的文件名字符串,只要文件名包含单引号、SQL关键字等特殊内容,就会触发报错甚至SQL注入攻击。

正确实现方式

使用参数化查询+批量插入,避免手动拼接SQL,同时对齐字段映射关系:

import datetime

insert_data = []
for filename, attr_list in structured_files.items():
    # 从属性中的13位毫秒时间戳转换为datetime类型,匹配created字段要求
    create_ts = int(attr_list[1]) / 1000
    create_time = datetime.datetime.fromtimestamp(create_ts)
    # 严格按照表字段顺序组装单行数据:id_key、name、date、sample、coord_y、coord_x、created
    single_row = (
        filename,
        attr_list[0],
        attr_list[1],
        attr_list[2],
        attr_list[3],
        attr_list[4],
        create_time
    )
    insert_data.append(single_row)

# 参数化SQL,%s为mysql.connector的官方参数占位符
insert_q = """
INSERT INTO data_11 (id_key, name, date, sample, coord_y, coord_x, created)
VALUES (%s, %s, %s, %s, %s, %s, %s)
"""
# 批量执行插入,驱动自动处理参数转义、格式适配
mycursor.executemany(insert_q, insert_data)
# 提交事务持久化数据
mydb.commit()

内容的提问来源于stack exchange,提问作者Mindtrip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:21:40