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
相关产品推荐
相关产品推荐

