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

Python执行MySQL LOAD DATA INFILE报错及代码调试求助

问题分析与解决

错误根源

你调用cursor.execute()时传参逻辑错误:该方法第一个参数是完整的SQL语句字符串,第二个参数是用于SQL参数化的占位符值(必须是list、tuple或dict类型)。但你把LOAD DATA INFILE的SQL语句拆成了两个字符串参数传入,导致第二部分SQL被当成参数处理,而它是字符串类型,不符合参数要求,所以抛出ProgrammingError。同时原代码的字符串拼接存在引号嵌套混乱的问题,也会导致SQL语句格式错误。

修复方案

将完整的SQL语句拼接成一个字符串,作为execute()的唯一参数(无需传第二个参数,这里不需要参数化)。推荐用f-string简化拼接,避免引号嵌套错误:

# 处理表名前缀,替换特殊字符
table_prefix = re.sub('[.-]', '_', i)
# 拼接完整文件路径
file_path = os.path.join(path, i, file)
# 构造格式正确的完整SQL语句
sql = f"""
LOAD DATA INFILE '{file_path}'
INTO TABLE `{table_prefix}`.posts
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
"""
# 执行SQL
cursor1.execute(sql)

额外注意事项

  • 权限配置:确保MySQL服务器开启了local_infile参数,且你的数据库用户拥有FILE权限,否则LOAD DATA INFILE可能执行失败。如果是读取本地文件,可改用LOAD DATA LOCAL INFILE,同时在创建数据库连接时指定allow_local_infile=True。
  • 路径转义:如果文件路径包含空格、特殊字符,要确保路径被正确包裹,示例中用单引号包裹路径可处理大部分场景。
  • 注入风险:如果i或file是外部输入内容,直接拼接SQL会存在注入风险,需手动过滤非法字符(LOAD DATA INFILE不支持参数化文件路径)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:27:10