使用pandas+pymysql导入含JSON格式列的CSV到MySQL时遇SQL语法错误的解决求助
pandas+pymysql导入含JSON格式列的CSV到MySQL时遇SQL语法错误的解决求助
看起来你遇到的问题核心在于:CSV里的JSON格式列(列表/字典)是以字符串形式存储的,直接用escape_string转义后插入MySQL的JSON类型字段,很容易因为引号嵌套、格式不标准等原因触发SQL语法错误。而且手动转义并不是处理这类场景的最佳方式,我之前也踩过类似的坑,给你一套可靠的解决方案:
第一步:先把CSV里的JSON字符串解析为Python原生对象
pandas读取CSV时,这些pictures、financial_info列会被识别为普通字符串(比如带引号的"[\"url1\", \"url2\"]"),我们需要先把它们解析成Python的列表/字典,确保格式是标准的JSON结构:
import pandas as pd import json def parse_json_column(value): """解析CSV中的JSON字符串,处理解析失败的情况""" try: # 若CSV里的字符串有多余转义,可先做替换:value.replace('\\"', '"') return json.loads(value) except (json.JSONDecodeError, TypeError): # 解析失败时返回None,后续可根据需求调整处理逻辑 return None # 读取CSV并解析JSON列 data = pd.read_csv(filename, encoding="utf-8") data["pictures"] = data["pictures"].apply(parse_json_column) data["financial_info"] = data["financial_info"].apply(parse_json_column)
第二步:用参数化查询插入数据库,避免手动转义
直接手动转义字符串很容易出错,还存在SQL注入风险。pymysql的参数化查询会自动处理转义和类型转换,完美适配MySQL的JSON字段:
import pymysql def load_data_to_db(df): # 建立数据库连接,建议用utf8mb4支持全字符集 conn = pymysql.connect( host="你的数据库地址", user="你的用户名", password="你的密码", database="你的数据库名", charset="utf8mb4" ) cursor = conn.cursor() # 请根据你的实际表结构调整字段和表名 insert_sql = """ INSERT INTO property_data (pictures, financial_info) VALUES (%s, %s) """ # 批量插入更高效,整理所有待插入记录 records = [] for _, row in df.iterrows(): # 将Python对象转为标准JSON字符串 pic_json = json.dumps(row["pictures"]) fin_json = json.dumps(row["financial_info"]) records.append((pic_json, fin_json)) # 批量执行插入操作 cursor.executemany(insert_sql, records) conn.commit() # 关闭数据库连接 cursor.close() conn.close()
为什么原来的方法不行?
你之前用escape_string只是简单转义了引号,但CSV里的JSON字符串本身可能存在格式问题(比如多余的转义符),而且手动转义无法保证生成的字符串符合MySQL JSON字段的严格格式要求。参数化查询则会自动处理所有转义逻辑,同时我们先解析再转成标准JSON字符串,确保插入的内容是MySQL能识别的合法JSON。
额外注意事项
- 如果CSV里的JSON字符串存在异常转义(比如
\\"),可以在parse_json_column函数中先做替换处理 - 数据量较大时,
executemany比逐行execute的效率提升非常明显 - 务必确认MySQL表的对应字段类型确实是
JSON(而非TEXT或VARCHAR)
备注:内容来源于stack exchange,提问作者PetrSevcik
相关产品推荐
相关产品推荐

