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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 02:42:57